神秘的内存泄漏C ++

时间:2014-04-05 08:23:07

标签: c++ vector memory-leaks

我正在创建一个创建2D迷宫的程序。部分过程是使用其中包含不同内容的切片填充2D矢量。我似乎在某处创建了一个内存泄漏,而且几个小时的搜索引导我找到Visual Leak Detector。我现在仍然在寻找泄漏方面遇到一些麻烦,但我想我知道它的阻塞.VLD返回的堆栈包括我的tile的构造函数和调用它们创建的函数,两者都是我将在下面包括哪些内容。

平铺构造函数

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
}

tile类只有一个字符串向量和一个char作为属性,因此只有虚拟析构函数。在构建tile矢量的类中,删除tile矢量的析构函数部分是这样的:

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();

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

3 个答案:

答案 0 :(得分:5)

现代C ++中手动内存管理的一个解决方案是永远不要使用运营商新删除。 当你在代码中看到它们时 - 它就是代码味道的标志。

使用

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

它会主要自动地将内容从作用域中解除分配。

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

答案 1 :(得分:0)

拿一个计数器。每次malloc或new时都会增加,当你自由或删除时减少。 这将缩小你的搜索范围以找到问题。最后检查counter.U的值也可以检查连续分配和解除分配是否有序。

答案 2 :(得分:0)

我找到了违规行,我正在运行一个.clear()方法而没有实际“删除”内容。