C API函数分配它们的输出还是让用户指定输出缓冲区是一个好主意吗?例如:API设计 - 分配输出?
BOOL GetString(
PWSTR *String
);
...
PWSTR string;
GetString(&string);
Free(string);
VS
BOOL GetString(
PWSTR Buffer,
ULONG BufferSize,
PULONG RequiredBufferSize
);
...
// A lot more code than in the first case
更具体我不知道为什么在Win32 API主要使用第二种情况下(例如GetWindowText,LookupAccountSid)。如果一个API函数知道输出有多大,为什么用户会尝试猜测输出大小?我找不到有关为什么会使用第二种情况的任何信息。
另外:LookupAccountSid示例特别糟糕。它在内部使用LSA API,它为调用者分配输出。然后,LookupAccountSid可以让用户分配一个缓冲区(并猜测正确的缓冲区大小),只要它可以返回LSA的输出!为什么?
这取决于。这两个习语都被使用。两者都有优点和缺点。 – 2010-01-19 00:51:42
除了能够使用基于堆栈的缓冲区之外,第二种情况的优点是什么? – wj32 2010-01-19 00:53:50
它允许调用者使用他们的分配器的选择。如果您分配内存并将其留给主叫方以释放,则主叫方需要使用相应的取消分配器 - 这可能不是他们的偏好。填充调用者提供的缓冲区允许他们为他们的目的选择合适的分配器,而不是依赖API选择的分配器。 – 2010-01-19 01:08:54