È una buona idea che le funzioni API C assegnino il loro output o che l'utente specifichi il buffer di output? Per esempio:Progettazione API: allocare l'output?
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
In particolare mi chiedo il motivo per cui l'API Win32 utilizza principalmente il secondo caso (ad esempio GetWindowText, LookupAccountSid). Se una funzione API sa quanto è grande l'output, perché l'utente prova a indovinare la dimensione dell'output? Non riesco a trovare alcuna informazione sul perché il secondo caso verrebbe utilizzato.
Inoltre: l'esempio LookupAccountSid è particolarmente negativo. Internamente utilizza l'API LSA, che alloca l'output per il chiamante. Quindi LookupAccountSid consente all'utente di allocare un buffer (e indovinare la dimensione del buffer corretta) quando potrebbe restituire l'output di LSA! Perché?
Dipende. Entrambi gli idiomi sono usati. Entrambi hanno vantaggi e svantaggi. –
Quali sono i vantaggi del secondo caso, oltre a essere in grado di utilizzare un buffer basato su stack? – wj32
Consente al chiamante di utilizzare la propria scelta di allocater. Se si assegna memoria e si lascia il chiamante libero, il chiamante deve utilizzare il deallocatore corrispondente, che potrebbe non essere la loro preferenza. La compilazione di un buffer fornito dal chiamante consente loro di scegliere un allocatter appropriato per i loro scopi, piuttosto che basarsi su quello scelto dall'API. –