C API 函数分配其输出或让用户指定输出缓冲区是个好主意吗?例如:
BOOL GetString(
PWSTR *String
);
...
PWSTR string;
GetString(&string);
Free(string);
对比
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 返回输出时分配一个缓冲区(并猜测正确的缓冲区大小)!为什么?
最佳答案
Win32 API 不预先分配缓冲区,因为它想让调用代码选择如何提供缓冲区。它允许他们提供堆栈和各种基于堆的缓冲区。有几个地方缓冲区的最大大小是提前知道的,开发人员希望使用基于堆栈的缓冲区的简单性。
文件系统是最好的例子,因为路径不会超过 MAX_PATH
。所以而不是分配+免费。开发人员只需声明一个基于堆栈的缓冲区。
让 C API 分配内存的好处是它简化了调用模式。 Win32 模式的缺点是大多数时候您最终会调用 API 两次。第一次确定缓冲区的大小,然后第二次使用适当大小的缓冲区。使用 API 分配的缓冲区只需要一次调用。
缺点是你从调用者那里拿走了分配的选择。此外,您必须传达您的选择,以便他们正确释放 API(例如,windows 可以从几个不同的地方分配)。
关于c - API设计——分配输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2090311/