簡體   English   中英

如何重載運算符new和delete以跟蹤內存?

[英]How to overload operator new and delete to track memory?

我想通過重載new / delete來跟蹤內存以檢查泄漏並檢查內存消耗(偷看等等)。

但是,我注意到有時有時會調用一個刪除操作,而沒有相應的新操作(即使在使用boost的幾行代碼的簡單程序中),看起來也可以通過另一種方式(malloc?)獲取內存,並且該刪除操作很高興在以后將其釋放。 這導致我遇到問題,因為我需要通過分配存儲信息(大小)。

我重載了以下方法,是否缺少一個功能? 或者這是我的c ++編譯器/增強版的bug?

void * operator new( size_t size );
void * operator new( size_t size, const std::nothrow_t& ) noexcept;
void * operator new[]( size_t size );
void * operator new[]( size_t size, const std::nothrow_t& ) noexcept;

void operator delete( void* ptr);
void operator delete[]( void* ptr);
void operator delete( void* ptr, const std::nothrow_t&) noexcept;
void operator delete[]( void* ptr, const std::nothrow_t&) noexcept;

我在Windows和mingw-w64 gcc下運行,因此我更喜歡使用“代碼”解決方案而不是特定的工具解決方案(“ valgrind不可用”),這也使我幾乎可以正常運行程序。

Microsoft標准庫有時會直接使用內部分配函數,而不是通過運算符。 而且並非始終如一。 幾年前,我使用DUMA嘗試了此操作 ,但是由於您遇到的那種問題而在流開始失敗時放棄了。

可以僅以可視泄漏檢測器的方式使其在代碼中起作用,但隨后卻錯過了有趣的情況。

但是,最近我注意到,在Wine Wiki上,他們有一個頁面列出了valgrind的幾種替代方法 從中我嘗試了Dr.Memory ,它基本上等效於valgrind memcheck工具,並且在Windows上像魅力一樣工作。

另外,使用工具實際上要簡單得多,因為您只需構建常規的調試版本並在該工具下運行即可。 試圖覆蓋分配的泄漏檢測器非常復雜。

記憶博士非常出色且免費

http://www.drmemory.org/

它不需要檢測代碼,並且代碼保持幾乎與沒有代碼時相同的性能。 我已經使用了很多次來查找和修復泄漏

暫無
暫無

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

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