2009-11-10 6 views
2

je vais avoir un problème de fuite de mémoire et il est en fait générer à partir du tableau de structure suivante:mémoire étrange fuite

TagStruct TagData [] = 
{ 

    { Tag_SecurityToken, string("x-abc-security-token"), string("ab-security-token") } , 
    { Tag_XYZ, string("x-abc-xyz"), string("ab-xyz") }, 
    { Tag_ChunkCount, string("x-abc-meta-chunk"), string("ab-meta-chunk") }, 
    { Tag_OriginalFileSize, string("x-abc-meta-totalsize"), string("ab-meta-totalsize")} 

}; 

la chose étrange est bien sûr le problème de fuite de mémoire et la question la plus étrange est que quand je ferme le client VS dépose les premier, troisième et quatrième éléments mais pas le 2ème élément (Tag_XYZ). La fuite de mémoire semble générer dans la première manche avant d'appeler même le tableau, et enfanta à l'esprit que j'utilise uniquement le tableau à des fins de vérification:

string Get_Tag (Tags tag) 
{ 
    return m_ClientType == CType_ABC ? TagData[tag].strABC : TagData[tag].strAB; 
} 

Cest en fait toute la raison. Il n'y a donc aucune allocation de tas/mémoire en ligne d'aucune sorte.

aussi la structure Tag ressemble STH comme ceci:

struct TagStruct 
    { 
     Tags tag; 
     std::string strABC; 
     std::string strAB; 
    }; 

Je voudrais également vous dire que c'est un tableau global et je l'ai aussi essayé de le rendre statique, mais continué à obtenir fuite de mémoire, aussi J'ai essayé de déclarer les chaînes dans le tableau comme "str" plutôt que string("str") mais j'ai continué à avoir des fuites de mémoire. Oui, la fuite de mémoire est statique, ce qui signifie qu'elle ne se construit pas au fil du temps mais qu'il vaut mieux conserver un code propre. Aucune suggestion??

+0

errr .. je ne vois pas une fuite .. vous sûr? –

+0

Eh bien c'est ce que VS dit, et franchement je ne vois pas vraiment de fuite non plus, c'est pourquoi j'ai utilisé le mot "bizarre" –

Répondre

7

Ceci est un exemple d'une fausse fuite - le détecteur de fuite voit que la mémoire allouée n'est pas libérée au point où le détecteur est exécuté. Mais le détecteur est exécuté avant les destructeurs d'objets statiques et donc avant que la mémoire ne soit libérée. C'est pourquoi c'est une fuite du point de vue du détecteur mais ce n'est pas vraiment une fuite.

+0

pensait que moi même mais je voulais vérifier ... –

+0

Je voudrais aussi savoir pourquoi VS ne dépose que les 1er, 3ème et 4ème éléments du tableau et non le 2ème ??? –

+0

@Red Serpent Pour contourner le problème, vous pouvez rendre la structure non-statique en la mettant dans la fonction Get_Tag. Je ne sais pas ce que le compilateur peut faire pour optimiser cela, mais je pense qu'il n'y aura pas de gros problèmes de performance. – foraidt

1

c'est une fausse alarme, mais même si ce n'était pas ça n'aurait rien voulu, étant une variable globale (ou statique) l'espace pour ce tableau est calculé et alloué au moment de la compilation, pour être stocké dans le segment de données, cette mémoire ne se libère jamais. fuites de mémoire se produit lorsque la mémoire est alloué dynamiquement en cours d'exécution sans être publié