c ++代码中的内存泄漏

时间:2014-12-05 01:42:29

标签: c++ memory-leaks visual-studio-2013

我正在使用c ++在Visual Studio中编写代码。 我的测试说我有内存泄漏。我不明白为什么。

这是错误:

检测到内存泄漏! 转储对象 - > e:\ gbm \ inf1005c \ td6 \ exercice1 \ exercice1.cpp(175):{1417}正常块0x0073C7C8,0字节长。  数据:<>

非常感谢。

请注意,colletion是一个结构,并且内存泄漏的行是这样的:     nouvelleCollection.livres = new Livre * [nTitresPareils];

Collection retrouverLivresParNom(const wstring& titre, const Collection& collection) // Mettre les bons paramètres.

{     int nTitresPareils = 0;

// Retrouver les livres dans la collection dont le titre correspond à la recherche
for (int i = 0; i < collection.nLivres; i++){
    bool trouve = (wcsstr(collection.livres[i]->titre, titre.c_str()) != nullptr);
    if (trouve)
        nTitresPareils ++;
}

// Allouer l'espace qui contiendra le tableau des livres trouvés
Collection nouvelleCollection;
nouvelleCollection.livres = new Livre*[nTitresPareils]; 

// Copier les pointeurs vers les livres trouvés
int compteur = 0;

for (int i = 0; i < collection.nLivres; i++){
    bool trouve = (wcsstr(collection.livres[i]->titre, titre.c_str()) != nullptr);
    if (trouve){
        nouvelleCollection.livres[compteur] = collection.livres[i];
        compteur++;
    }
}

nouvelleCollection.nLivres = nTitresPareils;
nouvelleCollection.nLivresAlloues = nTitresPareils;

// Retourner le nombre de livres trouvés
return nouvelleCollection;

}

1 个答案:

答案 0 :(得分:-1)

首先,您需要确保Collection(Collection::~Collection())的析构函数在delete[]成员上调用livres。这样可以防止内存泄漏。甚至结构都可以有析构函数。

但是,当你这样做时,你还需要另外修复。默认的复制构造函数将对该类的成员执行浅表复制,因此将复制指向书籍数组的指针,但不会复制整个数组。

因为您按值返回Collection,所以Collection的本地副本将在返回时被销毁。当发生这种情况时,livres数组将被释放,并且在调用函数中为其指定返回值的Collection变量将具有空livres指针或更糟的悬空指针。

所以你还需要做两件事之一:

1)您需要使用new Collection在堆上创建集合并通过指针(Collection*

返回它

2)您需要在Collection中创建一个复制构造函数来执行书籍列表的深层复制(livres)。

对你的问题的评论也很好,考虑使用std :: vector而不是分配你自己的数组。如果你使用std :: vector,你不必担心专门处理它的破坏或复制。

Bonne Chance!