检测到堆腐败

时间:2014-12-01 15:45:47

标签: c++ visual-studio-2013 dynamic-memory-allocation delete-operator

这就是我记忆的方式。

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;
}

在整个代码中我不会对新阵列进行任何更改,但它告诉我我讨厌一些问题,我不能指出问题,任何帮助都会很棒。

3 个答案:

答案 0 :(得分:6)

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

访问你不拥有的内存,因为这样分配了这个数组:

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

此数组中的最后一个元素具有索引Variables.length() - 1

在调试器中运行它应该是有益的。我相信,一些静态分析工具(例如lint)会强调这种误用。

您还可以考虑使用boost::scoped_array或类似内容来删除手动删除的需要。早期学习C ++的一个好教训是尽可能采用RAII而不是手动内存管理。

答案 1 :(得分: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

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