2009-12-22 3 views
2

J'utilise HDF5 pour lire une chaîne dans un char* attribué par new[]. J'utilise ensuite un appel string :: assign() pour copier ces données là où je le veux vraiment. J'appelle alors delete[] sur ce char *. Cela apparaît comme la source d'une fuite de mémoire en utilisant TotalView. Il montre les appels mutés dans stdlibC++ sous delete[] à replace_safe, mutate, create, puis malloc. Qu'est-ce qui se passe, et est-ce vraiment une fuite de mémoire? J'ai mis GLIBCXX_FORCE_NEW=1 ici aussi.Appel Malloc supprimer [] apparaissant comme fuite de mémoire dans totalview

Voici un exemple de code qui duplique la situation. Notez que valgrind ne montre aucune fuite et si je ne mets pas un point d'arrêt avant l'appel cout, il n'y a pas de fuite trouvée par totalview.

#include <string> 
#include <iostream> 
#include <cstdlib> 

int main() 
{ 
    std::string str; 

    int len = strlen(getenv("PATH")); 
    char* x = new char[len + 1]; 
    strcpy(x, getenv("PATH")); 
    x[len] = '\0'; 

    str.assign(x); 

    delete[] x; 

    std::cout << str << std::endl; 
} 
+0

L'exécution de ce programme par valgrind produit aucun avertissement. "utilisation de tas totale: 2 allocs, 2 libère, 146 octets alloués" –

+0

Will, OP n'a-t-il pas dit cela lui-même? –

+1

Ne pouvez-vous pas faire 'str = getenv (" PATH ")'? – UncleBens

Répondre

3

Il devrait être bien:
Mais je suggère d'utiliser std :: vecteur plutôt que newing un tableau de char:

std::vector<char> x(len+1); 
strcpy(&x[0], getenv("PATH")); 

La raison pour laquelle je le faire est que la assign méthode () peut potentiellement lancer une exception. En tant que tel, la suppression peut ne pas être appelée et donc vous pourriez fuir en présence d'une exception. En utilisant le vecteur que vous avez financé, la mémoire est nettoyée à cause de RAII.

+0

+1. En raison de la mention RAII. – paercebal

+0

Je suggère d'utiliser std :: string plutôt que std :: vector, puisque l'OP utilise 'char *' plutôt que 'unsigned char *'. –

+0

Hmm ... alors que ce que vous dites est totalement valide, est-ce qu'il essaie même de répondre à la question? –

2

Non lié à la fuite, mais si vous connaissez la longueur préfèrent strncpy sur strcpy

+0

Rappelez-vous que 'strcpy' copiera tous les caractères jusqu'à ce qu'il trouve un caractère de fin nul, qu'une adresse illégale soit frappée, ou que le monde se termine. –

+0

Une caractéristique intéressante de 'std :: string' est que la fonctionnalité de copie est intégrée et * testée *. –