如何确定C ++中发生内存泄漏的位置?

时间:2011-02-15 02:54:39

标签: c++

如何确定内存泄漏的位置,在C ++中不使用任何工具

我的程序中有内存泄漏,我正在尝试确定泄漏的位置。

如果你能对这个问题有所了解,请做。

4 个答案:

答案 0 :(得分:3)

由于问题(现在)说“不使用任何工具”,因此您可能会减少查看源代码。一个要看的地方是每个类的构造函数和析构函数。

  • 构造函数分配的所有内存是否都是由析构函数释放的?
  • 如果类中的其他方法分配内存,那么析构函数是否释放了内存?

否则,查找new(各种类型)的实例,并确保您可以确定释放已分配内存的位置。

而且,如果您被误导到通过malloc()realloc()free()将C内存分配与C ++代码混合在一起,那么请对每个分配进行类似的练习,确保你知道相应的版本在哪里。 (我假设您永远不会尝试delete分配malloc()所分配的free()空间,也不会new分配{{1}}空间。)

考虑是否应该使用各种自动指针管理器类之一来确保释放内存。

最好使用可用工具突出显示泄漏的位置。

答案 1 :(得分:1)

如果你拒绝使用其他工具,那么你几乎就会陷入人眼,版本1.0。不幸的是,除非代码非常简单,否则这可能并不容易。我并不是说听起来很讨厌,但在精心设计的代码中,内存泄漏是非常罕见的。这意味着你正在处理的代码开始时有一些相当严重的问题,在这种情况下通过检查发现泄漏的可能性比不是非常缓慢和痛苦。

检查的明显起点是newmalloccalloc等的所有用途,以及(应该)匹配对delete的调用,free等。

答案 2 :(得分:0)

分析工具应该能够提供帮助。 例如:valgrind

此外,您可以尝试检查编译器的所有警告消息。

编辑:我错过了关于“没有工具”的部分。

检查编译器警告我认为这是一个很好的第一步。

您还可以尝试在所有免费/删除代码周围放置调试语句,以确保释放有效的内容。

查找常见错误,例如:“delete ptr”而不是“delete [] ptr”。

只需对代码中的所有“新”和“删除”语句进行grep /搜索,看看它们是否有意义。

答案 3 :(得分:0)

查看crtdbg类的_CrtDumpMemoryLeaks()函数