win32下 如何定位記憶體流失

來源:互聯網
上載者:User

在mobile平台上寫代碼久了,平時的時候都是自己給出檢索記憶體流失的方案的。但是在win32下的開發,記憶體流失的檢索式如此的簡單。在windows下,定義有這樣一個宏_CrtDumpMemoryLeaks。它可以協助你在任何地方列印出當年的記憶體使用量情況,比如說當前有多少記憶體使用量了沒有被釋放掉。

比如說你有這樣一段程式:

int main (void)<br />{<br />int* p = new int[100];<br />_CrtDumpMemoryLeaks();<br />}

如果執行以下,在輸出裡面可以看到這樣的一段文字:

Detected memory leaks!
Dumping objects ->
{86} normal block at 0x003A6C10, 400 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.

 

很進階啊!至少到這一步,你知道了這裡有記憶體流失了(當然實際上這裡的例子進程結束的時候,系統還是會把這塊記憶體回收的),如果我們想進一步地看到具體哪一行分配的記憶體呢?這個更進階一點,就需要多做點事情了。首先你要定義一個新的標頭檔,用它來重定義一下new操作符,下面就是這個MyMemoryNew.h

#ifdef _DEBUG<br />#include <crtdbg.h><br />#define DEBUG_NEW new(_NORMAL_BLOCK ,__FILE__, __LINE__)<br />#else<br />#define DEBUG_NEW new<br />#endif

現在你的程式也做一下改動:

#ifdef _DEBUG<br />#include "MyMemoryNew.h"<br />#define new DEBUG_NEW<br />#endif<br />int main (void)<br />{<br />int* p = new int[100];<br />_CrtDumpMemoryLeaks();<br />}

當然啦#include一下我們的新標頭檔,然後定義一下new。okay運行一把,這個時候的輸出就不同了:

Detected memory leaks!
Dumping objects ->
c:/project/testapplication/greedy algorithm/ga/dijkstra_algorithm/dijkstra_algorithm.cpp(137) : {86} normal block at 0x003A6C10, 400 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.

可以看到,不僅告訴你了有記憶體沒有刪除,同時還有了具體的行號!這樣給我們的unittest帶來比較大的便利。所以如果是一下邏輯上的模組,如果可以的話可以讓他在win32下面跑,測試,等到沒有記憶體問題了,在搬回到移動平台上!這樣就可以避免討厭的記憶體問題。

當然如果你想一勞永逸的在移動平台上弄也可以,有好事者在code project上面給出了一個wince版本的crtdbg.h,當然原理是一樣的,利用重定義的new和__LINE__,__FILE__這兩個宏,每次的new都把對應地址,檔案,行號等資訊記錄下來存入某個容器, delete的時候刪除對應的資訊,最後程式結束的時候檢查容器中是否還有內容,如果有內容就是沒有釋放的記憶體。這樣的容器自己實現也是比較簡單的,那個code project上的連結在這裡 http://www.codeproject.com/KB/mobile/ce_crtdbg.aspx。有空可以再看看。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.