0

這是我分配內存的方式。檢測到堆損壞

Expression = new char[MemBlock.length()]; 
VarArray = new char[Variables.length()]; 
for (unsigned int i = 0; i < MemBlock.length(); i++) 
{ 
    Expression[i] = MemBlock.at(i); 
} 
Expression[MemBlock.length() + 1] = NULL; 
for (unsigned int i = 0; i < Variables.length(); i++) 
{ 
    VarArray[i] = Variables.at(i); 
} 
VarArray[Variables.length() + 1] = NULL; 

當我嘗試將其刪除我的錯誤...

Logic::~Logic(){ 
delete[] VarArray; -> happens on this line. 
VarArray = NULL; 
delete[] Expression; 
Expression = NULL; 
} 
在整個代碼我不不做出新的陣列任何更改它告訴我,我哈默爾一些currpution

,我不能指出問題,任何幫助將是偉大的。

回答

6

VarArray[Variables.length() + 1] = NULL;

訪問你不擁有,因爲這陣因此分配的內存:

VarArray = new char[Variables.length()];

此數組中的最後一個元素的索引是Variables.length() - 1

在調試器中運行應該是有啓發性的。我相信,一些靜態分析工具(如lint)會強調這種濫用。

您也可以考慮使用boost::scoped_array或類似的刪除需要手動刪除。早期學習C++的好教訓是採用RAII,而不是手動內存管理。

+0

非常感謝 – 2014-12-01 15:51:46

2
VarArray = new char[Variables.length()]; 
VarArray[Variables.length() + 1] = NULL; 

你不能這樣做,它是2個元素。 相同的其他陣列。

1
Expression[MemBlock.length() + 1] = NULL; 

是未定義的行爲。正如

VarArray[Variables.length() + 1] = NULL; 

在第一種情況下,你只能指數高達MemBlock.length() - 1,而在第二種情況Variables.length() - 1

在這兩種情況下,您都要寫入已分配數組的末尾,並且可能會覆蓋用於管理動態分配內存的控制結構(由運行時庫)。