我已經這個類,與屬性附加傷害「單詞」刪除字符的動態數組在C++
class Node {
char *word;
裏面的節點構造,我這樣做asignation:
word = new char[strlen(someword)];
在的析構函數Node類,我嘗試刪除由詞所指向的內容:執行後
delete []word;
我得到一個消息節目:
「在003E4F48堆塊修改的003E4F51過去要求的1大小」
什麼我做得還不夠好?
我已經這個類,與屬性附加傷害「單詞」刪除字符的動態數組在C++
class Node {
char *word;
裏面的節點構造,我這樣做asignation:
word = new char[strlen(someword)];
在的析構函數Node類,我嘗試刪除由詞所指向的內容:執行後
delete []word;
我得到一個消息節目:
「在003E4F48堆塊修改的003E4F51過去要求的1大小」
什麼我做得還不夠好?
strlen
將返回字符串的長度,但不會考慮空終止的額外字節。我的猜測是,你正在複製一個字符串並追加一個空字節,但是當你最初分配內存時你沒有考慮它。請嘗試更改代碼如下:
word = new char[strlen(someword) + 1];
你有一個腐敗的堆 - 在你的代碼別的地方你正在寫的分配內存外或刪除的東西,你不應該是 - 你確定你不是說的strlen (someworrd)+ 1 ?.這個問題的最佳解決方案是使用std:; string或std :: vector而不是動態數組。
您的程序中存在緩衝區溢出,您沒有發佈代碼中的其他地方。問題在於你沒有分配足夠的內存 - 在字符串末尾沒有爲空終止符留出空間。你應該改變這個分配:
word = new char[strlen(someword) + 1]; // +1 for null terminator
...
strcpy(word, someword);
你應該感激你的C運行時發現了你的錯誤。在大多數情況下,一個字節的緩衝區溢出會導致無聲的內存損壞,直到很久以後纔會被檢測到。
您還應該考慮使用std::string
類,它可以爲您自動管理內存,因此您不必處理像這樣的細微問題。
問題解決!!非常感謝,男士! – anonymous 2010-05-04 17:26:23