2014-12-05 85 views
-1

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

这里是错误:

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

非常感谢。

请注意,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; 

}

+2

规则1:当有一个'new'时,记得'delete'。规则编号为ZERO:将“新”和“删除”封装在RAII设施中。 – 2014-12-05 01:50:53

+0

您应确保Collection类的析构函数调用 – 2014-12-05 01:53:50

+1

规则-1(在规则#0之前出现):除非必要,否则不要使用动态内存分配变量(例如运行时的未知数量或过大的本地变量或自动存储变量)。 – 2014-12-05 02:05:27

回答

-1

首先,你需要确保收集的析构函数(Collection::~Collection())调用delete[]livres件上。这将防止你的内存泄漏。即使结构可以有析构函数。

但是,当你这样做时,你也必须做出另一个修复。默认的拷贝构造函数将会为该类的成员做一个浅度拷贝,所以指向书籍数组的指针将被复制,但不是整个数组。

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

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

1)您需要使用new Collection在堆上创建您的采集,并通过指针返回它(Collection*

OR

2)您需要在Collection中创建一个拷贝构造函数来完成书籍列表的深层副本(livres)。

对你的问题的评论也不错,考虑使用std :: vector而不是分配你自己的数组。如果你使用std :: vector,你不必担心特别处理它的销毁或复制。

Bonne Chance!