2014-12-05 141 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!