神秘的记忆泄漏C++
Mysterious Memory Leak C++
我正在制作一个创建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++中手动内存管理的一种解决方案是永远不要使用运算符new和delete。当您在代码中看到它们时 - 这是代码气味的标志。
用
std::shared_ptr with std::make_shared
std::unique_ptr with std::make_unique
它将主要自动处理范围之外的分配内容。
如果提供代码中引用的变量的类型,则会更容易提供帮助。
拿一个计数器。只需在每次 malloc 或新的时增加,在释放或删除时减少。这将缩小搜索范围以查找问题。最后检查计数器的值。U还可以检查连续分配和取消分配是否有序。
我发现了有问题的行,我正在运行一个 .clear() 方法,而没有实际"删除"内容。
相关文章:
- valgrind-hellgrind与泄漏检查的结果不同
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 尽管遵循了规则,内存泄漏在哪里
- 为什么调用堆栈数组会导致内存泄漏
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 使用模板类的自定义列表类型中的内存泄漏
- 为什么以下C++代码中存在内存泄漏?
- Klocwork Inside的资源泄漏
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 我是否生成线程并导致内存泄漏?
- 多线程程序中出现意外的内存泄漏
- 为什么此函数会导致内存泄漏?
- 在 C++ 库中使用cythonized python时内存泄漏
- 需要帮助查找内存泄漏
- C++功能泄漏内存,我是C++新手,不确定如何解决
- 瓦尔格林德的内存泄漏使用新的
- CPP 中的瓦尔格林德和记忆泄漏:"Conditional jump or move depends on uninitialised values"
- 无法找出我的代码中的内存泄漏