我正在使用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;
}
答案 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!