我正在制作一个创建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)
所以我并没有真正看到任何地方的内存泄漏.我确保删除旧的瓷砖,然后用新瓷砖替换它,瓷砖中没有任何对象,所以默认的复制功能应该没问题吧?我真的很感激帮助.如果您需要更多代码来帮助我,请告诉我们!
现代C++中手动内存管理的一个解决方案是永远不要使用operator new和delete.当你在代码中看到它们时 - 它是代码味道的标志.
使用
std::shared_ptr with std::make_shared
std::unique_ptr with std::make_unique
Run Code Online (Sandbox Code Playgroud)
它将主要自动地将内容从范围中解除分配.
如果提供代码中引用的变量类型,将更容易提供帮助.