神秘的记忆泄漏C++

Mysterious Memory Leak C++

本文关键字:泄漏 C++ 记忆      更新时间:2023-10-16

我正在制作一个创建2D迷宫的程序。该过程的一部分是使用具有不同内容的图块填充 2D 矢量。我似乎在某处造成了内存泄漏,数小时的搜索使我找到了视觉泄漏检测器。不过,我仍然在寻找泄漏时遇到一些麻烦,但我想我知道它所在的块。VLD 返回的堆栈包括我的磁贴构造函数和调用其创建的函数,我将在下面介绍这两个函数。

磁贴构造函数

tileL::tileL(void)
{ 
    type = 'L';
    string con = L_CON;
    for (int y=0;y<TILE_SIZE;y++)
    {
    contents.push_back(con.substr(y*TILE_SIZE,TILE_SIZE));  //VLD points to this line
    }
}

在堆栈上,调用构造函数的块。此块将矢量中的图块替换为另一个图块:

char c;
c=contents[0][0]->getType();
if(c=='X'||c=='O'||c=='I'||c=='T')
{
    delete contents[0][0];
    contents[0][0]=new tileL(); //This is the line that calls the constructor
}

磁贴类只有一个字符串向量和一个字符作为属性,因此只有虚拟析构函数。在构建图块向量的类中,析构函数中删除图块向量的部分如下所示:

for(int i=0;i<contents.size();i++)
{
    for(int j=0;j<contents[i].size();j++)
        delete contents[i][j];
    contents[i].clear();
}
contents.clear();

所以我并没有真正看到任何地方的内存泄漏。我确保在用新瓷砖替换旧瓷砖之前删除旧瓷砖,并且瓷砖中没有任何对象,所以默认复制功能应该没问题吧?我真的很感激你的帮助。如果您需要更多代码来帮助我,请告诉我!

现代

C++中手动内存管理的一种解决方案是永远不要使用运算符newdelete。当您在代码中看到它们时 - 这是代码气味的标志。

std::shared_ptr with std::make_shared
std::unique_ptr with std::make_unique

它将主要自动处理范围之外的分配内容。

如果提供代码中引用的变量的类型,则会更容易提供帮助。

拿一个计数器。只需在每次 malloc 或新的时增加,在释放或删除时减少。这将缩小搜索范围以查找问题。最后检查计数器的值。U还可以检查连续分配和取消分配是否有序。

我发现了有问题的行,我正在运行一个 .clear() 方法,而没有实际"删除"内容。