神秘的内存泄漏C++

0 c++ memory-leaks vector

我正在制作一个创建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
    }
}
Run Code Online (Sandbox Code Playgroud)

向上移动堆栈,调用构造函数的块.该块用另一个块替换向量中的tile:

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
}
Run Code Online (Sandbox Code Playgroud)

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();
Run Code Online (Sandbox Code Playgroud)

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

ber*_*kus 5

现代C++中手动内存管理的一个解决方案是永远不要使用operator newdelete.当你在代码中看到它们时 - 它是代码味道的标志.

使用

std::shared_ptr with std::make_shared
std::unique_ptr with std::make_unique
Run Code Online (Sandbox Code Playgroud)

它将主要自动地将内容从范围中解除分配.

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