c++ 析构函数 delete

发布于 2022-09-01 15:50:25 字数 556 浏览 27 评论 0

#include <iostream>

using namespace std;

class BASE
{
public:
    virtual ~BASE()
    {
        cout<<"Base deconstruction"<<endl;
    }

};
class CCHILD: public BASE
{
public:
    ~CCHILD()
    {
        cout<<"CCHILD deconstruction"<<endl;
    }

};

int main(int argc, char const *argv[])
{
    BASE *Pbase;
    BASE b;
    Pbase = &b;
    delete Pbase;
    cout<<"-----"<<endl;
    CCHILD c;
    Pbase = &c;
    delete Pbase;
    return 0;
}

请大神解释,delete为什么提示无效的指针啊

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

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

发布评论

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

评论(3

酒几许 2022-09-08 15:50:25

可以简单地认为C++的变量有两类,一类是在程序初始化时已经分配了固定空间的,另一类是由malloc动态申请的位于堆空间中的;
比如BASE b,那么变量b所在位置、所占空间等都是可以确定下来的,属于已经静态分配完成的变量,由编译器安排了其内存地址,是被写死在可执行文件中的;
而由malloc()/new申请的变量则是动态的,其地址在运行时才被告知,也只有这样的动态分配空间的变量才能被free()/delete释放空间
你的代码想要删除一个被写死在程序中的变量,怎么可能运行成功

生活了然无味 2022-09-08 15:50:25

老兄,我在你另一个问题里不是回答了么,关于 free()
http://segmentfault.com/q/1010000002985157

new/deletemalloc/free 是一回事。

哦,我错了,你那个问题问的也是 delete


如果你想使用 delete,一定记得跟 new 配对。

cppint main(int argc, char const *argv[])
{
    BASE *b = new BASE();
    delete b;
    cout<<"-----"<<endl;
    CCHILD *c = new CCHILD();
    delete c;
    return 0;
}
烟沫凡尘 2022-09-08 15:50:25

楼上的解释过于粗暴。。。 肿么也不能理解为写死在代码中吧 常量的位置是固定data段的

delete 分两部 调用析构函数 释放堆上内存,而你这种新建变量的方法是在栈上,是不能由你显示的delete的,你想想你删掉了栈上的一块 那么其他栈上资源要不要移动?那一移动offset就都不对了。。。

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