delete 对象的指针

发布于 2022-09-01 15:19:59 字数 245 浏览 18 评论 0

class A
{
public:
    A()
    {
        i =10;
    }
private:
    int i;
};
int main(){

    A a;
    A *p = &a;
    delete p;
    return 0;
}

请问这段程序运行为什么出错?
运行结果:free(): invalid pointer: 0xbfc367b8 ***

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

乖不如嘢 2022-09-08 15:19:59
cppint main(){
    A a;
    A *p = &a;
    delete p;
    return 0;
}

A a 产生了一个 A 对象,似乎 delete &a 释放 a 的内存空间是没错的。但是不要忘了,在 main() {} 函数结束的时候,会自动释放其中的局部变量,也就是 a,加上你写的 delete,就会释放两次,所以会报错。

一般情况下 newdelete 对应,没用 new 完全不需要 delete。而且尽可能保证 newdelete 在同一段代码块中;如果需要在两个地方分别进行操作的时候,通常是在 constructor 中 new,在 destructor 中 delete;或者在 create() 中 new,在delete()或release() 中 delete,同时注意 create() 与 delete() 配对……

眼眸里的快感 2022-09-08 15:19:59

没有new过的地址是不需要delete的,new和delete应该是配对的

野稚 2022-09-08 15:19:59

new 是将对象的内存存放在中,也就是放在用户控件,内存由用户自行管理,所以内存的释放,要用delete

A a;这种,是将对象的内存存放在,也就是系统控件,内存的释放由系统管理,所以使用delete会报错。要释放的地址并不是用户可以控制的

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文