2010-05-04 38 views
1

我已經這個類,與屬性附加傷害「單詞」刪除字符的動態數組在C++

class Node { 
    char *word; 

裏面的節點構造,我這樣做asignation:

word = new char[strlen(someword)]; 

在的析構函數Node類,我嘗試刪除由詞所指向的內容:執行後

delete []word; 

我得到一個消息節目:

「在003E4F48堆塊修改的003E4F51過去要求的1大小」

什麼我做得還不夠好?

回答

1

strlen將返回字符串的長度,但不會考慮空終止的額外字節。我的猜測是,你正在複製一個字符串並追加一個空字節,但是當你最初分配內存時你沒有考慮它。請嘗試更改代碼如下:

word = new char[strlen(someword) + 1]; 
1

你有一個腐敗的堆 - 在你的代碼別的地方你正在寫的分配內存外或刪除的東西,你不應該是 - 你確定你不是說的strlen (someworrd)+ 1 ?.這個問題的最佳解決方案是使用std:; string或std :: vector而不是動態數組。

6

您的程序中存在緩衝區溢出,您沒有發佈代碼中的其他地方。問題在於你沒有分配足夠的內存 - 在字符串末尾沒有爲空終止符留出空間。你應該改變這個分配:

word = new char[strlen(someword) + 1]; // +1 for null terminator 
... 
strcpy(word, someword); 

你應該感激你的C運行時發現了你的錯誤。在大多數情況下,一個字節的緩衝區溢出會導致無聲的內存損壞,直到很久以後纔會被檢測到。

您還應該考慮使用std::string類,它可以爲您自動管理內存,因此您不必處理像這樣的細微問題。

+0

問題解決!!非常感謝,男士! – anonymous 2010-05-04 17:26:23