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

在这两种情况下,您都要写入已分配数组的末尾,并且可能会覆盖用于管理动态分配内存的控制结构(由运行时库)。