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



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

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旧 c = 空点 -> 文本 = 空点有这个错误是我不小心写的,(对不起,我没有注意到,现在这就是我的意思(。问题是,禁止在此任务中使用字符串,因此必须以 C 方式完成。对不起,这么多编辑。我真的必须学习如何提出准确的问题。

堆损坏是由对 strcpy 的调用引起的,该调用写入了分配的内存块的末尾。当代码调用 delete[]检测到

为什么这个错误是在释放内存的那一刻弹出的,而不是更早的?

根据经验,当发生损坏时,不一定会在 Visual Studio 中检测到堆损坏。您不能依赖在损坏后发生的检测。尽管在这种情况下,在下一个可能的时间检测到损坏以检测损坏。Visual Studio 只检查何时分配或释放内存。

最新更新