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

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

my_class *p = new my_class();

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

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

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

谢谢了先!

阅读 21.3k
3 个回答

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

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

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

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

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

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

if(p)
{
    delete p;
    p = NULL;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题