¿Es una buena idea que las funciones de C API asignen su salida, o que el usuario especifique el búfer de salida? Por ejemplo:Diseño de API: ¿asignar salida?
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
Más específicamente me pregunto por qué la API Win32 utiliza principalmente el segundo caso (por ejemplo GetWindowText, LookupAccountSid). Si una función API sabe qué tan grande es la salida, ¿por qué el usuario debe intentar adivinar el tamaño de salida? No puedo encontrar ninguna información sobre por qué se usaría el segundo caso.
También: el ejemplo de LookupAccountSid es especialmente malo. Internamente utiliza la API LSA, que asigna la salida para la persona que llama. Luego, LookupAccountSid hace que el usuario asigne un búfer (y adivine el tamaño de búfer correcto) cuando podría devolver la salida de LSA. ¿Por qué?
Depende. Ambos modismos son usados. Ambos tienen ventajas y desventajas. –
¿Cuáles son las ventajas del segundo caso entonces, además de poder usar un buffer basado en pila? – wj32
Permite a la persona que llama usar su elección de asignador. Si asigna memoria y deja que la persona que llama libere, la persona que llama debe usar el correspondiente contador de direcciones, que podría no ser su preferencia. Llenar un búfer proporcionado por el que llama permite que elijan un asignador adecuado para sus propósitos, en lugar de depender del elegido por la API. –