请教:C++指向类的指针如何释放内存?析构还是删除?
假设有个指向C++类的指针:
my_class *p = new my_class();
现在有3种方式释放内存:
delete p; // 方法一
p-> ~my_class(); // 方法二
my_class:: ~my_class(); // 方法三
请问哪一种是正确的?它们之间是等价的吗?——我认为是方法二,因为只释放内存、没删除指针;方法一也可以,但是另外删除了指针。
谢谢了先!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
先说结论:只能用方法一。
最好再完善下
`
if(p)
{
delete p;
p = NULL;
}
`
分析:
new/delete成对使用
new负责在堆上创建对象。其中包括两个步骤:1)使用malloc分配内存 2)在分配的内存上创建对象,调用对象的构造函数;
delete负责销毁堆上的对象:1)调用对象的析构函数 2)free掉已分配内存。
显然,方法二仅仅只是调用了析构函数,并没有free内存。方法三与方法二是同一个意思,只是使用类名::调用,使用类名调用的方法/变量要求是class-level的,而destructor是obj-level的,所以这种调用方式是不合理的。
你的理解是错的. 析构函数
~my_class()
是释放对象所管理的资源,而不是释放对象本身的.比如所以,你用new分配,那么只能用delete释放了.
建议无论是学习还是使用,都迁移到智能指针吧,主要看这里:C++ 核心指导方针 R: 资源管理
析构函数
会在主函数运行结束后(即return x;之后)默认执行
。所以在程序中,你只需要考虑指针的删除,防止内存泄漏
和野指针
: