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