2010-06-11 57 views
1

當處理隨機存儲器覆蓋時,在MSVC中,可以通過調用_CrtCheckMemory來驗證堆在各個點的狀態,並且至少有一小部分信心知道直到檢查不負責的代碼對於可能導致new或malloc稍後失敗的任何錯誤。GCC/XCode相當於_CrtCheckMemory?

在XCode中,什麼是在內存覆蓋嘗試和框中的等效方法?我現在所擁有的僅僅是一個對新的調用的隨機失敗,在某些代碼的深處,並沒有真正意識到代碼在損壞的堆中運行了多長時間直到那一刻。

回答

0

此功能實際上內置於GCC的堆中。 如上所述here 啓用它是Xcode ::運行菜單上最簡單的方法:Enable Guard Malloc

-1

這並不直接解決你的問題,但我感到不得不迴應。正如你所說,像CRT檢查功能這樣的工具只會給你一個小小的信心,並且不會解決內存以外的資源泄漏問題。如果你發現自己依賴於這些工具,我會說你的C++開發方法非常非常錯誤。在過去的10年中,我的代碼在內存泄漏方面沒有出現任何問題。這不是因爲我是一些C++編程的上帝,而是因爲我在代碼中使用了RAII的基本工具,智能指針和標準庫集合,並且儘可能避免使用new進行顯式動態內存分配。每當你發現自己寫一行代碼如:

Something * p = new Something; 

停下來,問自己:「有什麼辦法可以避免這樣做嗎?如果答案是「否」,那麼問自己爲什麼要爲一個原始指針分配內存,如果你找不到任何方法(這很少出現這種情況,請立即編寫代碼來管理指針取消分配,並確保該代碼是異常安全的。

如果你採用這種方法,你將不需要像特殊CRT函數或Valgrind這樣的工具,並且你將在調試時節省大量時間。

+0

在一個理想的世界將有可能成爲一個純粹的C++程序員,其中程序中所有的結構是可實現用C++成語。 在我的世界中,我將一個10年前的windows代碼庫移植到Mac上,寫得很好。混合使用C,C +(由C++學習C++並編寫基本C代碼,但帶有一些類的人生成的C++的奇怪子集),所有必須與動態庫互操作的C++ lls通過導出C函數,製作接口的C函數,或者僅僅通過導出C++類。樂趣。 – 2010-06-11 10:18:09

+0

這是一個荒謬的說法。我是微軟的開發人員,_CrtCheckMemory()被廣泛使用。基於這個人的說法,我想我們在微軟做了一切錯誤。 驗證堆和堆棧的完整性有助於發現緩衝區溢出,指針分配問題,編譯器生成的錯誤,... 在Linux上使用Valgrind或者滾動您自己的工具來掛鉤分配並執行您自己的檢查分配開始和結束時的一種幻數。 – Byron 2016-10-08 16:43:47

0

正如在尼爾的回答只是暗示,讓更加明確:

據我所知,沒有任何工具,一應俱全的_CrtCheckMemory海合會 IIRC有s個ome在那裏檢查了malloc庫,但是我沒有發現它們與_CrtCheckMemory一樣可用。 然而,有Valgrind這是部署不干擾,並給予 整個結果更多。