>  Q&A  >  본문

C++内存泄露检测

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

我当时就不会了。

PHPzPHPz2714일 전537

모든 응답(4)나는 대답할 것이다

  • 阿神

    阿神2017-04-17 13:03:37

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

    회신하다
    0
  • 巴扎黑

    巴扎黑2017-04-17 13:03:37

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

    회신하다
    0
  • 怪我咯

    怪我咯2017-04-17 13:03:37

    Purify或者strike

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-17 13:03:37

    手写构造器。。。

    회신하다
    0
  • 취소회신하다