Est-ce une bonne idée que les fonctions de l'API C allouent leur sortie ou que l'utilisateur spécifie le tampon de sortie? Par exemple:Conception de l'API - allouer la sortie?
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
Plus précisément, je me demande pourquoi l'API Win32 utilise principalement le second cas (par exemple GetWindowText, LookupAccountSid). Si une fonction API connaît la taille de la sortie, pourquoi l'utilisateur essaie-t-il de deviner la taille de la sortie? Je ne trouve aucune information sur la raison pour laquelle le second cas serait utilisé.
En outre: l'exemple LookupAccountSid est particulièrement mauvais. En interne, il utilise l'API LSA, qui alloue la sortie à l'appelant. LookupAccountSid obtient alors l'utilisateur pour allouer un tampon (et deviner la taille de mémoire tampon correcte) quand il pourrait juste renvoyer la sortie de LSA! Pourquoi?
Cela dépend. Les deux idiomes sont utilisés. Les deux ont des avantages et des inconvénients. –
Quels sont alors les avantages du second cas, outre le fait d'être capable d'utiliser un tampon basé sur une pile? – wj32
Il permet à l'appelant d'utiliser leur choix d'allocateur. Si vous allouez de la mémoire et laissez l'appelant libérer, l'appelant doit utiliser le deallocater correspondant - ce qui peut ne pas être leur préférence. Le remplissage d'un tampon fourni par l'appelant leur permet de choisir un allocateur approprié pour leurs besoins, plutôt que de se fier à celui choisi par l'API. –