
Envoyé par
koala01
De fait... cela nous oblige donc à un code du genre de
1 2 3
| char *ret=new char[result.size()];
memcpy(ret,result.c_str());
return ret; |
avec obligation de gérer la libération de la mémoire dans les fonctions qui récupère ce pointeur
Je comprend de mieux en mieux ce que je n'aime pas dans les DLL's

Non - parce que tu forces l'utilisateur à libérer la mémoire. Hors, rien n'oblige l'utilisateur a utiliser le même runtime dans la DLL et dans le programme appelant. De fait, au moment de la destruction de la chaine de caractère allouée, il est probable qu'une corruption de la pile ou du tas se produise (ça arrive notamment sous Visual C++ si on mixe les modèles de compillation single-threaded debug, multithreaded debug, single-threaded release, multithreaded release, single-threaded debug DLL, multithreaded debug DLL, single-threaded release DLL, et multithreaded release DLL (DLL == utilisant le CRT sous la forme d'une DLL). Comme on voit, la multiplicité des modèles fait qu'on a de forte chance de se retrouver dans un mauvais cas).
C'est la raison pour laquelle les API Windows préfère passer les chaines de résultat en paramètre de la fonction appelée:
error_code_type my_function(param1, ..., char* out_string, int out_string_max_len);
De cette manière, l'appelant est responsable de l'allocation et de la désallocation. Par contre, cela oblige la fonction appelée à vérifier si
* out_string est valide
* la taille maximale de out_string est suffisante pour stocker le résultat de la fonction.
Dans le premier cas, la fonction renvoie généralement un code d'erreur du type 'paramètre invalide'. Dans le second cas, elle renverra un code du type 'la taille n'est pas suffisante'.
Partager