2013-03-18 85 views
0

在c或C++中,是否有任何方法來跟蹤動態分配的內存。假設我有這樣的代碼在c/C++中跟蹤動態內存分配

void somefunction(some arguments,long mc){ 
//allocate b bytes of memory using malloc,calloc or new 
mc += b; 


//allocate once again, say p bytes 
mc += p; 


//deallocate q bytes using delete or free() 
mc -= q; 

print "mc bytes allocated at this point"; 

} 

可以聲明mc爲全局函數並在所有函數中使用它。問題是當內存被釋放時,沒有辦法知道剛剛釋放了多少內存,因此在這種情況下如何更新mc。

+0

您是否使用MS Visual Studio? – Motes 2013-03-18 19:11:31

回答

3

爲malloc(),calloc和free()創建包裝函數。在malloc/calloc中,分配額外的字大小來維持分配多少內存,並總結以mc分配的字節。當釋放時,讀取第一個標題字節以知道要釋放多少內存,並從mc中減小相同的大小。

+2

你也可以使用內存泄漏檢測工具來提供堆使用情況分析,比如Valgrind(http://www.linuxprogrammingblog.com/using-valgrind-to-debug-memory-leaks)。 http://stackoverflow.com/questions/53426/memory-leak-detectors-for-c – user2181624 2013-03-18 19:15:40

+0

+1爲valgrind,絕對要走的路 – 2013-03-18 21:18:06

+0

謝謝我會嘗試valgrind – scv 2013-03-20 00:33:46

0

您無法直接使用long。包裝longMyLong類和超載operator new爲您的類。這將跟蹤堆中的內存分配。

1

使用包裝器創建開銷,僅僅爲了調試目的,我更喜歡hook malloc/calloc/free/etc,只是轉儲他們正在做的事情的信息。

這樣做的好處是,當你去發佈(不再需要調試的東西),你只需刪除掛鉤功能,就是這樣。

0

攔截內存分配例程,像它的顯示在內存泄漏檢測工具:

https://sourceforge.net/projects/diagnostic/ http://diagnostic.sourceforge.net/index.html

(甚至你的應用程序中它集成)。

您將不僅獲得malloc,realloc,free,還包括所有其他分配。

但請注意,內存掛鉤正在多線程環境中運行,即使您的應用程序是單線程的,其他線程中也可能會發生很多事情。

保護不當的代碼可能會導致死鎖 - 請參閱自述文件中的代碼設計。