所以,我需要一些幫助。我正在使用C++開發一個項目。不過,我想我已經設法破壞了我的堆。這是基於我添加了一個std::string
一類的事實,從另一個std::string
分配一個值:內存管理,堆損壞和C++
std::string hello = "Hello, world.\n";
/* exampleString = "Hello, world.\n" would work fine. */
exampleString = hello;
崩潰我有一個堆棧轉儲系統。所以基本上我需要停止並通過我所有的代碼和內存管理的東西,找出我搞砸了。代碼庫仍然很小(大約1000行),所以這很容易實現。
不過,我對這種東西滿腦子,所以我想我會把它扔在那裏。我在一個Linux系統上,並與valgrind
探討,雖然不知道我在做什麼,但它確實報告std::string
的析構函數是一個無效的自由。我不得不承認從谷歌搜索中獲得「堆腐敗」這個詞;任何有關這類東西的通用文章也將受到讚賞。
(在rm -rf ProjectDir
之前,在C#中再次這樣做:d)
編輯: 我還沒有明確表態,但我要問的是如何診斷這些種類的內存問題的意見。我知道std :: string的東西是正確的,所以這是我所做的事情(或者一個錯誤,但沒有選擇的問題)。我確信我可以檢查我寫的代碼,你很聰明的人很快就會看到這個問題,但我想把這種代碼分析添加到我的'工具箱'中。
+1,很好的清單!然而,我反對#8 - 雖然它阻止了「壞」訪問,但它實際上是一種代碼異味,隱藏了我的經驗中不良的邏輯或糟糕的對象生命週期管理...... – Roddy 2010-03-15 15:46:40
現在,C++在標準中有自己的智能指針庫,所以不需要Boost或Loki。 – 2015-12-21 15:41:03