【问题标题】:Memory leak in c++ codeC++代码中的内存泄漏
【发布时间】:2014-12-05 01:42:29
【问题描述】:

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

这是错误:

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

非常感谢。

请注意,collection 是一个结构体,存在内存泄漏的行是这一行: 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;

}

【问题讨论】:

  • 规则一:有new时,记得delete。零号规则:将newdelete 封装到RAII 设施中。
  • 你应该确保你的 Collection 类的析构函数调用
  • 规则 -1(在规则 #0 之前):除非必要,否则不要使用动态内存分配变量(例如运行时的未知数量或太大而不能成为本地或自动存储变量)。

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


【解决方案1】:

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

但是,当您这样做时,您还必须进行另一个修复。默认的复制构造函数会对该类的成员进行浅拷贝,因此将复制指向书籍数组的指针,但不会复制整个数组。

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

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

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

2) 您需要在 Collection 中创建一个复制构造函数来对图书列表进行深度复制 (livres)。

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

好机会!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    相关资源
    最近更新 更多