首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么delete[]会导致堆损坏错误?

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

Stack Overflow用户
提问于 2017-03-23 19:25:51
回答 2查看 1.7K关注 0票数 0

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

代码语言:javascript
运行
复制
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[]时会导致堆损坏错误?是什么引起的?

这个错误是由调试器引发的,我的问题是:为什么这个错误出现在释放内存的时刻,而不是更早?以这种方式在代码中找到任何bug会容易得多。

@编辑旧的c= nullptr -> text = nullptr --我意外地写了一个bug (对不起,我没有注意到,这就是我的意思)。问题是,在这个任务中禁止使用字符串,所以必须使用C-way。很抱歉编辑了这么多。我真的得学会如何问准确的问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-23 20:59:46

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

根据经验,当发生损坏时,不一定会在Visual中检测堆损坏。你不能指望在腐败之后才能被发现。尽管在这种情况下,在下一个可能的时间检测到了腐败,以检测腐败。Visual只在分配或释放内存时进行检查。

票数 1
EN

Stack Overflow用户

发布于 2017-03-23 19:54:21

堆损坏是由对的调用导致的造成的,该调用在分配的内存块结束后编写。当代码名为时,检测到了delete[]

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42985262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档