Ist es eine gute Idee für C-API-Funktionen, ihre Ausgabe zuzuordnen, oder den Benutzer den Ausgabepuffer anzugeben? Zum Beispiel:API-Design - Ausgabe zuweisen?
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
Insbesondere frage ich mich, warum in erster Linie des Win32-API, um den zweiten Fall verwendet (z GetWindowText, LookupAccountSid). Wenn eine API-Funktion weiß, wie groß die Ausgabe ist, warum versucht der Benutzer, die Ausgabegröße zu erraten? Ich kann keine Informationen darüber finden, warum der zweite Fall verwendet wird.
Auch: das Beispiel LookupAccountSid ist besonders schlecht. Intern verwendet es die LSA-API, die die Ausgabe für den Aufrufer zuweist. Dann ruft LookupAccountSid den Benutzer auf, um einen Puffer zuzuweisen (und die richtige Puffergröße zu erraten), wenn er nur die Ausgabe von LSA zurückgeben könnte! Warum?
Kommt drauf an. Beide Idiome werden verwendet. Beide haben Vor- und Nachteile. –
Was sind die Vorteile des zweiten Falles, neben der Möglichkeit, einen Stack-basierten Puffer zu verwenden? – wj32
Es ermöglicht dem Anrufer, seine Wahl der Zuweisungsliste zu verwenden. Wenn Sie Speicher reservieren und es dem Anrufer überlassen, ihn freizugeben, muss der Anrufer den entsprechenden Deallocater verwenden - was möglicherweise nicht seine Präferenz ist. Durch das Füllen eines vom Aufrufer bereitgestellten Puffers können sie einen geeigneten Allokierer für ihre Zwecke auswählen, anstatt sich auf den zu verlassen, den die API ausgewählt hat. –