为什么delete []会导致堆损坏错误?

时间:2017-03-23 19:25:51

标签: c++ dynamic-arrays

我帮助我的朋友调试代码,有问题的部分是这样的:

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方式完成。 很抱歉这么多的编辑。我真的要学习如何提出准确的问题。

2 个答案:

答案 0 :(得分:2)

strcpy的调用导致导致导致 ,该调用写入已分配的内存块的末尾。当代码调用delete[]

时,检测到

答案 1 :(得分:1)

为什么在释放内存时出现此错误,而不是更早?

根据经验,在发生损坏时,不一定在Visual Studio中检测到堆损坏。你不能依赖腐败后发生的检测。虽然在这种情况下,在下一个可能的时间检测到损坏以检测损坏。 Visual Studio仅在您分配或释放内存时进行检查。