请教:C++指向类的指针如何释放内存?析构还是删除?

发布于 2022-09-06 03:08:39 字数 278 浏览 44 评论 0

假设有个指向C++类的指针:

my_class *p = new my_class();

现在有3种方式释放内存:

delete p; // 方法一
p-> ~my_class(); // 方法二
my_class:: ~my_class(); // 方法三

请问哪一种是正确的?它们之间是等价的吗?——我认为是方法二,因为只释放内存、没删除指针;方法一也可以,但是另外删除了指针。

谢谢了先!

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

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

发布评论

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

评论(3

最佳男配角 2022-09-13 03:08:39

先说结论:只能用方法一。
最好再完善下
`
if(p)
{
delete p;
p = NULL;
}
`
分析:
new/delete成对使用
new负责在堆上创建对象。其中包括两个步骤:1)使用malloc分配内存 2)在分配的内存上创建对象,调用对象的构造函数;
delete负责销毁堆上的对象:1)调用对象的析构函数 2)free掉已分配内存。
显然,方法二仅仅只是调用了析构函数,并没有free内存。方法三与方法二是同一个意思,只是使用类名::调用,使用类名调用的方法/变量要求是class-level的,而destructor是obj-level的,所以这种调用方式是不合理的。

骄兵必败 2022-09-13 03:08:39

现在有3种方式释放内存:

你的理解是错的. 析构函数~my_class()是释放对象所管理的资源,而不是释放对象本身的.比如

struct my_class {
    FILE *f;
    // 析构函数释放类`my_class`对象所管理的f资源
    ~my_class() {
        delete f;
    }
}

所以,你用new分配,那么只能用delete释放了.
建议无论是学习还是使用,都迁移到智能指针吧,主要看这里:C++ 核心指导方针 R: 资源管理

无人问我粥可暖 2022-09-13 03:08:39

析构函数会在主函数运行结束后(即return x;之后)默认执行。所以在程序中,你只需要考虑指针的删除,防止内存泄漏野指针

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