2013-09-24 52 views
0

所以,我從來沒有經歷過這一點。通常當我得到一個錯誤時,它總是觸發一個斷點。但是,這次我構建解決方案並在不進行調試的情況下運行它(ctrl + F5),它不會給我帶來任何錯誤並且可以正確運行。但是,當我嘗試調試它(F5),它給了我這個錯誤:複製MyString的構造函數會導致HEAP錯誤。只在調試模式下產生錯誤

HEAP[MyString.exe]: HEAP: Free Heap block 294bd8 modified at 294c00 after it was freed 
Windows has triggered a breakpoint in MyString.exe. 

This may be due to a corruption of the heap, which indicates a bug in MyString.exe or any of the DLLs it has loaded. 

This may also be due to the user pressing F12 while MyString.exe has focus. 

The output window may have more diagnostic information. 

這種分配是由於今晚,所以我會很感激的任何快速幫助。

我的代碼是在這裏: https://gist.github.com/anonymous/8d84b21be6d1f4bc18bf

我已經變窄的問題倒在主於線在main.cpp中圖18(c = A + B)的級聯成功,但然後當它是被複制到c中,錯誤信息發生在MyString.cpp(pData = new char [length + 1];)的第56行。

踢球者是我沒有這行代碼的問題,直到我試圖重載操作符>>。爲了試圖調試,我已經取消了該代碼。

再次,任何幫助將不勝感激!

+0

請在您的文章中發佈相關代碼,而不是在其他網站上。 –

回答

0

讓我們通過線18:

 
1. In line 17 you create string c with dynamically allocated memory inside. 
2. You make assignment: c = a + b: 
    2.1. Operator+ creates LOCAL object 'cat'. 
    2.2. cat's memory is allocated dynamically. 
    2.3. cat becomes concatenation of two given strings. 
    2.4. Operator+ exits. cat is LOCAL object and it's being destroyed. 
    2.4.1. cat is being destroyed. cat's destructor runs. 
    2.4.2. destructor deletes pData; 
    2.4.3. After delete you make *pData = NULL. //ERROR - should be pData = NULL (1) 
    2.5. c is initialized with result of operator+. 
    2.6. operator= calls copy(). 
    2.7. copy() allocates new memory without checking the current one. //ERROR - memory leak (2) 

(1) 的pData是char *。在析構函數中,我們有:delete [] pData(刪除內存),然後* pData = NULL。 由於pData是一個指針,* pData與pData [0]相同。所以你寫入已釋放的內存。這是你錯誤的原因。

(2) 其他問題。複製()會覆蓋當前內存而不檢查。應該是:

copy() 
{ 
    if(this->pData) 
    { 
     delete this->pData; 
    } 
    //now allocate new buffer and copy 
} 

而且,與原始字節(字符)打交道時,你不希望使用新的()和delete(),但malloc()和自由()代替。在這種情況下,在像copy()這樣的函數中,不是調用delete()然後是new(),而是簡單地使用realloc()。

編輯: 還有一件事:由於堆損壞造成的錯誤通常發生在調試過程中。在釋放二進制文件中,這會簡單地覆蓋一些已釋放(也可能已被其他人使用)的內存。這就是爲什麼在C++中使用內存進行調試時調試非常重要的原因。

相關問題