首页 > C++内存泄露检测

C++内存泄露检测

今天面试时面试官问了一道很有意思的题。
在某个程序运行期间,系统检测到其使用的内存越来越大,如何检测内存泄露的具体位置。

我当时就不会了。


手写构造器。。。


内存越来越大不一定是内存泄露,也有可能是自己做的cache
我觉得这个问题比较优雅的答案是:
1) 先确定是否为内存泄露,内存长期占用不释放(有的程序自己做了memory pool,是会自己触发释放的)为泄露,否则可能是程序内部有cache,也可能是程序自己对内存管理有池化
2)先用静态分析工具查看下可能的内存泄露
3)运行时的内存泄露不是工具能查出来的,需要自己分析,C++比较BT的一点是内存泄露是隐性的,而非显性的,如果整个程序全是静态库的,可以针对接口进行测试,确认大概是哪个模块造成了泄露,如果是有动态库包含在其中的,也建议先对接口进行测试,确认哪些模块会造成内存泄露,然后确认接口间的调用是否正常,看是否有隐形的泄露,也有些工具如purify可以打印些堆栈信息,不过针对特别复杂的环境,这个帮助还是有限。 而且windows和linux对于C++的某些features的实现也不尽相同,也有可能造成泄露,曾经见过一个库非常稳定的运行在Linux下,在windows下就会造成莫名其妙的泄露(一样的源码,支持跨平台)


Purify或者strike


我们用Valgrind.
另外,就回答这个面试题而言,我觉得可以这么答:调用brk(0)返回堆顶地址..

【热门文章】
【热门文章】