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

问题描述 投票:0回答:2

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

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[]时会导致堆损坏错误?是什么原因造成的?

这个错误是由调试器抛出的,我的问题是: 为什么这个错误是在释放内存的时候弹出的,而不是更早的? 通过这种方式发现代码中的错误会容易得多。

@编辑旧 c = nullptr -> text = nullptr 我不小心写了这个错误,(抱歉,我没有注意到,现在就是我的意思)。问题是,在此任务中禁止使用字符串,因此必须以 C 方式完成。

c++ dynamic-arrays
2个回答
3
投票

堆损坏是由对 strcpy 的调用导致的,该调用超出了分配的内存块的末尾。当代码调用

delete[]
时,它被检测到
    


1
投票

为什么这个错误是在释放内存的时候弹出的,而不是更早的? 根据经验,当发生损坏时,Visual Studio 中不一定会检测到堆损坏。您不能依赖在损坏后立即进行检测。尽管在这种情况下,损坏是在下一个可能的时间检测到损坏的。 Visual Studio 仅检查您何时分配或释放内存。

© www.soinside.com 2019 - 2024. All rights reserved.