2010-05-25 6 views
0

J'utilise ce code dans une classe pour faire une visite de contrôle WebBrowser un site:Quand dois-je libérer la mémoire?

void myClass::visitWeb(const char *url) 
{ 
    WCHAR buffer[MAX_LEN]; 
    ZeroMemory(buffer, sizeof(buffer)); 
    MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS, url, strlen(url), buffer, sizeof(buffer)-1); 

    VARIANT vURL; 
    vURL.vt = VT_BSTR; 
    vURL.bstrVal = SysAllocString(buffer); 

    // webbrowser navigate code... 

    VariantClear(&vURL); 
} 

J'appelle visitWeb d'une autre fonction de vide qui est appelé à la handleMessage() pour l'application. Ai-je besoin de faire un peu de désallocation de mémoire ici ?, Je vois que vURL est désalloué par VariantClear mais devrais-je libérer la mémoire pour le tampon? On m'a dit que dans un autre bool, j'ai dans la même application que je ne devrais pas libérer quoi que ce soit parce que tout se vide quand le bool retourne vrai/faux, mais que se passe-t-il sur ce vide?

+1

S'il vous plaît, ne dites pas "un autre vide" quand vous voulez dire "une autre fonction retournant le vide". Lorsque vous comprenez que vous avez affaire à de nombreuses fonctions, et que la seule différence est le type de retour, vous verrez les similitudes. –

+0

Il semble que "un autre bool" se réfère à "une autre fonction retournant un bool". Cela suggère à son tour qu'il ne comprend pas comment les variables sortent du cadre. Le type de retour n'affecte pas du tout cela, et en fait les variables peuvent sortir des portées internes avant même qu'une fonction ne retourne. – MSalters

+0

BTW, vous avez un dépassement de tampon. Le dernier paramètre à MultiByteToWideChar doit être 'MAX_LEN' (nombre de caractères). Vous passez actuellement 'MAX_LEN * sizeof (WCHAR)' (nombre d'octets). Et vous n'avez pas besoin de passer strlen (url); passez -1 à la place. – MSalters

Répondre

5

Je pense que vous avez des problèmes fondamentaux avec votre compréhension de la gestion de la mémoire. Dans ce cas, non, vous n'avez pas besoin de libérer explicitement de la mémoire. Vous n'avez jamais appelé new, vous n'avez donc pas besoin d'appeler le delete. buffer existe seulement sur la pile, et disparaîtra quand cette méthode retournera.

0

Je ne vois aucun new s, donc je ne m'attendrais pas delete s.

Je suppose que je regarderais la description de SysAllocString() pour voir si elle alloue la mémoire dont vous avez besoin pour vous débarrasser de vous-même.

+0

Merci, j'ai lu VariantClear() prendre soin de ce que SysAllocString() alloué. – extintor

+0

Oui, c'est probablement tout ce dont vous auriez besoin de vous inquiéter, alors. – John

+0

Correct; VariantClear sait qu'il doit appeler 'SysFreeString' parce que' vURL.vt == VT_BSTR'. – MSalters

3

Si vous le permettez, je vous suggère de le faire un peu différemment - je commence par la création d'une petite classe:

class bstr { 
    VARIANT content; 
public: 
    bstr(char const *url) { 
     WCHAR buffer[MAX_LEN] = {0}; 
     MultiByteToWideChar(CP_ACP, 
          MB_ERR_INVALID_CHARS, 
          url, 
          strlen(url), 
          buffer, 
          sizeof(buffer)/sizeof(buffer[0])-1); 
     content.V_T = VT_BSTR; 
     content.bstrVal = SysAllocString(buffer);   
    } 

    operator VARIANT const &() { return content; } 

    ~bstr() { VariantClear(&content); } 
}; 

Ensuite, votre code changerait quelque chose comme:

void myClass::visitWeb(const char *url) { 
    your_control.Navigate(bstr(url)); 
} 

et toute l'allocation et la libération sont traitées automatiquement à partir de là.

Même si vous n'utilisez pas une classe comme celle-ci, notez la modification de l'appel à MultiByteToWideChar. Le dernier paramètre est censé être le nombre de WCHAR éléments dans le tampon, pas le nombre de char s. Comme il est, vous avez mis en place un dépassement de tampon ...

+0

Je n'utilise pas std, j'ai juste commencé à apprendre cpp et je veux terminer ce projet avant d'apprendre à utiliser l'espace de noms std. Merci quand même. – extintor

+0

@extintor: dans ce cas, supprimer ce n'est pas un problème (déjà fait). –

Questions connexes