类对象需要手动释放吗?

一如当初 2011-08-06 07:11:22

MyClass aaa;
aaa.Print();
aaa.~MyClass();
aaa.Print(); // 上面不是析构释放了吗,怎么这里还能正常调用呢?

...全文
369 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
pathuang68 2011-08-06
  • 打赏
  • 举报
回复
除了使用了placement new,其它情况下都不要显示调用析构函数。
pathuang68 2011-08-06
  • 打赏
  • 举报
回复
这个问题,前面讨论过很多次了。

普通成员函数是类级别的,virutal或者纯虚函数是对象级别的。所以对已调用普通成员函数,只需要类型就OK了。请看下面的源代码:

#include <iostream>
using namespace std;

class A
{
public:
void fun()
{
cout << "This is in fun" << endl;
}

~A()
{
cout << "This is in ~dtor" << endl;
}
};

int main()
{
A a;
a.fun();
a.~A();
a.fun();

A* b = new A;
b->fun();
delete b; // 按道理都已经delete b了,但是下面的调用仍然可以成立
b->fun();

// 甚至这样都是可以的:
b = NULL;
b->fun();
return 0;
}
war10811 2011-08-06
  • 打赏
  • 举报
回复
这样会调用2次析构
一次你手动的,还有一次在被销毁之前,,因为是局部变量

析构的目的本来就是为了在内存销毁之前还能善后些什么~析构本身就一函数,类似回调函数
飞天御剑流 2011-08-06
  • 打赏
  • 举报
回复
是否会有内存泄漏或产生其它问题要视情况而定,但在C++中绝大多数情况下不需要显式析构。
一如当初 2011-08-06
  • 打赏
  • 举报
回复
那不手动释放会有内存泄漏或其他问题吗?我是用Delphi的,都是要手动建立释放对象的
黑娃 2011-08-06
  • 打赏
  • 举报
回复
在你的变量真正被销毁时,通常是超出作用域的时候会调用析构函数,但是不等于说析构函数是销毁对象的原因,有些析构可以什么都不用做的
飞天御剑流 2011-08-06
  • 打赏
  • 举报
回复
析构函数显式调用后对象就销毁了,对象销毁后对该对象的任何操作都是未定义行为。

是否需要显式调用析构函数要视代码需要,一般用在placement new上。

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧