如何确定内存泄漏的位置,在C ++中不使用任何工具
我的程序中有内存泄漏,我正在尝试确定泄漏的位置。
如果你能对这个问题有所了解,请做。
答案 0 :(得分:3)
由于问题(现在)说“不使用任何工具”,因此您可能会减少查看源代码。一个要看的地方是每个类的构造函数和析构函数。
否则,查找new
(各种类型)的实例,并确保您可以确定释放已分配内存的位置。
而且,如果您被误导到通过malloc()
,realloc()
和free()
将C内存分配与C ++代码混合在一起,那么请对每个分配进行类似的练习,确保你知道相应的版本在哪里。 (我假设您永远不会尝试delete
分配malloc()
所分配的free()
空间,也不会new
分配{{1}}空间。)
考虑是否应该使用各种自动指针管理器类之一来确保释放内存。
最好使用可用工具突出显示泄漏的位置。
答案 1 :(得分:1)
如果你拒绝使用其他工具,那么你几乎就会陷入人眼,版本1.0。不幸的是,除非代码非常简单,否则这可能并不容易。我并不是说听起来很讨厌,但在精心设计的代码中,内存泄漏是非常罕见的。这意味着你正在处理的代码开始时有一些相当严重的问题,在这种情况下通过检查发现泄漏的可能性比不是非常缓慢和痛苦。
检查的明显起点是new
,malloc
,calloc
等的所有用途,以及(应该)匹配对delete
的调用,free
等。
答案 2 :(得分:0)
分析工具应该能够提供帮助。 例如:valgrind
此外,您可以尝试检查编译器的所有警告消息。
编辑:我错过了关于“没有工具”的部分。
检查编译器警告我认为这是一个很好的第一步。
您还可以尝试在所有免费/删除代码周围放置调试语句,以确保释放有效的内容。
查找常见错误,例如:“delete ptr”而不是“delete [] ptr”。
只需对代码中的所有“新”和“删除”语句进行grep /搜索,看看它们是否有意义。
答案 3 :(得分:0)
查看crtdbg类的_CrtDumpMemoryLeaks()函数