我帮助我的朋友调试代码,有问题的部分是这样的:
class MyClass {
char * text;
public:
MyClass(const char * c) {
if (c != nullptr) {
text = new char[strlen(c)];
strcpy(text, c);
}
else
text = nullptr;
}
~MyClass() {
delete[] text;
}
};
int main() {
MyClass foo("bar");
return 0;
}
当然问题在于strlen(c)
,应该是strlen(c) + 1
。无论如何,让我感到惊讶的是,为什么在析构函数中调用delete []时会导致堆损坏错误?是什么造成的?
调试器抛出此错误,我的问题是: 为什么在释放内存时出现此错误,而不是更早? 以这种方式在代码中找到任何错误要容易得多。
@edit old c = nullptr - > text = nullptr 我不小心写了这个错误,(对不起,我没注意到,现在这就是我的意思)。问题是,禁止在此任务中使用字符串,因此必须以C方式完成。 很抱歉这么多的编辑。我真的要学习如何提出准确的问题。
答案 0 :(得分:2)
对strcpy
的调用导致导致导致 ,该调用写入已分配的内存块的末尾。当代码调用delete[]
。
答案 1 :(得分:1)
为什么在释放内存时出现此错误,而不是更早?
根据经验,在发生损坏时,不一定在Visual Studio中检测到堆损坏。你不能依赖腐败后发生的检测。虽然在这种情况下,在下一个可能的时间检测到损坏以检测损坏。 Visual Studio仅在您分配或释放内存时进行检查。