8
votes

Puis-je libérer la mémoire passée à Sysallocstring?

Lors de l'allocation d'un nouveau BSTR avec Sysallocstring via un wchar_t * sur le tas, devrais-je alors libérer l'original wchar_t * sur le tas?

est-ce la bonne façon? P>

wchar_t *hs = new wchar_t[20];
// load some wchar's into hs...
BSTR bs = SysAllocString(hs);
delete[] hs;


1 commentaires

Genre de drôle - j'ai complètement mal interprété les variables lorsque j'ai posté ma réponse (que j'ai ensuite supprimé). J'ai "vu" Supprimer [] BS; au lieu de hs. Je dois avoir besoin de nouveaux verres.


5 Réponses :


11
votes

Comme son nom l'indique, sysallocstring attribue sa mémoire, il ne "adopte" pas la mémoire de son argument. Les BSTR sont la taille-préfixe et résiliés null, donc "Adopter" une chaîne de style C est impossible, car il n'y a pas d'espace pour le préfixe de taille.


0 commentaires

3
votes

Oui, Supprimer la mémoire.


0 commentaires

12
votes

sysallocstring (), du Documentation , se comporte comme ceci:

Cette fonction attribue une nouvelle chaîne et copie la chaîne passée. P> blockQquote>

Donc, oui, une fois que vous avez appelé SysallOcstring, vous pouvez libérer votre tableau de caractères d'origine, car les données ont été copiées dans la nouvelle allouée BSTR. P>

la bonne façon de libérer une chaîne de wchar_t code> attribué avec nouveau [] code> est d'utiliser Suppr [] code>. p>

BSTR bs = SysAllocString(hs);
...
SysFreeString(bs);


0 commentaires