検索

ホームページ  >  に質問  >  本文

C++内存泄露检测

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

我当时就不会了。

PHPzPHPz2805日前588

全員に返信(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
  • キャンセル返事