假设有个指向C++类的指针:
my_class *p = new my_class();
现在有3种方式释放内存:
delete p; // 方法一
p-> ~my_class(); // 方法二
my_class:: ~my_class(); // 方法三
请问哪一种是正确的?它们之间是等价的吗?——我认为是方法二,因为只释放内存、没删除指针;方法一也可以,但是另外删除了指针。
谢谢了先!
假设有个指向C++类的指针:
my_class *p = new my_class();
现在有3种方式释放内存:
delete p; // 方法一
p-> ~my_class(); // 方法二
my_class:: ~my_class(); // 方法三
请问哪一种是正确的?它们之间是等价的吗?——我认为是方法二,因为只释放内存、没删除指针;方法一也可以,但是另外删除了指针。
谢谢了先!
现在有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;
}
6 回答6.9k 阅读✓ 已解决
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
2 回答2.9k 阅读✓ 已解决
先说结论:只能用方法一。
最好再完善下
`
if(p)
{
delete p;
p = NULL;
}
`
分析:
new/delete成对使用
new负责在堆上创建对象。其中包括两个步骤:1)使用malloc分配内存 2)在分配的内存上创建对象,调用对象的构造函数;
delete负责销毁堆上的对象:1)调用对象的析构函数 2)free掉已分配内存。
显然,方法二仅仅只是调用了析构函数,并没有free内存。方法三与方法二是同一个意思,只是使用类名::调用,使用类名调用的方法/变量要求是class-level的,而destructor是obj-level的,所以这种调用方式是不合理的。