簡體   English   中英

跟蹤c / c ++中的動態內存分配

[英]tracking dynamic memory allocation in 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聲明為global並在所有函數中使用它。 問題是當釋放內存時,無法知道剛剛釋放了多少內存,因此在這種情況下如何更新mc。

為malloc(),calloc和free()創建包裝函數。 在malloc / calloc中,分配額外的字大小以維護要分配的內存量,並匯總在mc中分配的字節。 釋放時,請讀取第一個標頭字節,以了解要釋放多少內存,並從mc中減小相同的大小。

使用包裝器會產生開銷,僅出於調試目的,我更喜歡掛接malloc / calloc / free / etc並僅轉儲有關它們在做什么的信息。

這樣做的好處是,當您發布(不再需要調試的東西)時,您只需刪除鈎子功能即可。

您無法直接long這樣做。 MyLonglong包裝,並為您的類提供operator new重載operator new 這將跟蹤堆中的內存分配。

您可以使用自定義內存分配器來跟蹤內存分配。 請參閱Doug Lea的參考實現

攔截內存分配例程,如內存泄漏檢測工具中所示:

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

(甚至可以將其集成到您的應用程序中)。

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

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM