2011-03-03 44 views
0

有沒有辦法跟蹤通過新的聲明分配的未釋放內存塊?未發佈的內存信息應在應用程序出口處列出,包含文件名,文件名文件行。這樣,應該有可能快速識別導致內存泄漏的新的語句。解決通過NEW語句分配的內存泄漏

如果我沒錯,MFC有DEBUG_NEW定義做這個工作。但是怎麼樣非MFC C++應用程序?

使用環境:Visual Studio 2010和Windows 7 64bit。

回答

2

Visual Studio CRT有一些功能可以幫助您在調試版本中找到內存泄漏,請閱讀http://msdn.microsoft.com/en-us/library/e5ewb1h3%28v=vs.80%29.aspx以獲取更多信息;

它也被普遍認爲是最佳實踐嘗試總是使用shared_ptr類自動管理你的記憶。如果您沒有使用shared_ptr,請考慮啓動。

+2

Stroustrup說:「請不要不小心用shared_ptrs替換指針,以防止內存泄漏」http://www2.research.att.com/~bs/C++0xFAQ.html#std-shared_ptr(best實踐是使用具有適當所有權語義的指針,「unique_ptr」通常更合適) – Cubbi 2011-03-03 20:18:46

+0

我並不完全同意這一點,但我想這是個人偏好。在任何遠程複雜的項目中,我認爲在'unique_ptr'上使用'shared_ptr'幾乎總是更好。很有可能另一個開發人員會出現,希望他們的模塊在一段時間內從你的模塊中借用一個對象,並用'shared_ptr'大量替換'unique_ptr'來實現這一點。 – 2011-03-03 20:40:40

+1

+1用於指向內置的VC++內存跟蹤工具。總是使用shared_ptr是不好的建議。然而,總是使用RAII是非常好的建議。 – 2011-03-03 21:16:37

1

有很多工具可以幫助您追蹤內存泄漏。所有這些都有其優點和缺點。

大多數工具的最大缺點是它們不會以自動方式向您顯示泄漏。您明確地必須在應用程序的生命週期中將您的內存狀態轉儲爲文件,然後再稍後轉儲該狀態,然後比較兩個狀態。這幾乎不利於開發人員。

視覺檢漏儀是一個更好的工具之一(在我看來)。它會自動記錄應用程序末尾的所有泄漏,包括調用堆棧。請注意,Microsoft C運行時也可以記錄泄漏,但是這樣做沒有調用堆棧。

我個人最喜歡的是簡單地做自己的記憶管理。實現全局新建並刪除自己(注意:有一些需要實現的變體),並在應用程序的末尾記錄所有未釋放的內存(使用最後銷燬的全局變量可能會有所幫助)。

+0

+1相關答案。嗨,謝謝你的回答。** Visual Leak Detector **是我的新工具,它看起來很有趣。到目前爲止,我超載了新的陳述,現在看起來相當不錯。 – 2011-03-04 02:49:46