首頁  >  問答  >  主體

C++内存泄露检测

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

我当时就不会了。

PHPzPHPz2764 天前558

全部回覆(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
  • 取消回覆