析构函数 是不是不能自己主动调用?

benjiam 2005-07-26 11:59:41
#include <iostream>
using namespace std;


class tt
{
private:
int age;
char *p;
public:
tt();
~tt();
void Show();

};


tt::tt()
{
age =100;
p = new char [100];
p[100-1] = '\0';

}

tt::~tt()
{
age =0;
delete [] p;
}

void tt::Show()
{

cout << age << endl;
cout << p << endl;
}
int main ()
{

tt pp;
pp.Show();
pp.~tt();

return 0;
}


这个代码有问题 因为以前构析函数都不是自己主动调用的。 所以没问题
如果pp.~tt() 不注视掉 vc 里面就有错误
gcc 里面 没错误


如果这个对象 我想立刻全删除干净 直接调用了构析函数以后 是不是所有的数据就全干净了
包括静态的变量?

...全文
1460 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
steven99ca 2005-07-27
  • 打赏
  • 举报
回复
Oops, continue..
Deconstructor is the same as other member functions, it won't erase itself. In your case, the ~tt() will be called twice, then it leads to delete p twice. then you run into the trouble... (:D
steven99ca 2005-07-27
  • 打赏
  • 举报
回复
It looks like a bug.
tt::~tt()
{
age =0;
delete [] p;
p=0; //you hsould reset it, otherwise ....
}

  • 打赏
  • 举报
回复
静态变量清除不了,其余对象还要用。
直接调用没问题,找MS去吧.
「已注销」 2005-07-27
  • 打赏
  • 举报
回复
jiajun2001说的对,delete一个指针后,要将它设为NULL,否则要是再次把它delete掉,结果无法预料,而delete一个空指针是安全的,析构函数显式调用一定要注意这个。
xuanwenchao 2005-07-27
  • 打赏
  • 举报
回复
系统会帮你调,你为什么要一定要直接调用呢?
如果需要可以先new一个,然后再delete时就会调了.
  • 打赏
  • 举报
回复
gcc 木出错是运气好
Jagen在路上 2005-07-27
  • 打赏
  • 举报
回复
不管是用何种方法调用了构造函数,都会有对应的析构方法跟着。这个我们是我在设计一个Socket封装时发现的。我在其中的一个构造函数中调用了另外一个构造函数,那么这个类的对象在出了作用域范围或被delete时会调用两次析构函数!
而析构函数却不存在这种问题,但是我发现楼主的代码最明显的错误就是delete之后,没有把指针设置成NULL或0,这是导致野指针的做法,所以VC中你会有错误,至于GCC下为什么没有错误就不得而知了!呵呵
以上是我的一些看法,请各位多指教
beyondtkl 2005-07-27
  • 打赏
  • 举报
回复
樓上的 不對哦
是可以顯式調用的 而且有些情況下 還必須顯式調用呢
hjf1010 2005-07-27
  • 打赏
  • 举报
回复
析构和构造函数都是不能显式调用的,这是基础啊,晕
healer_kx 2005-07-27
  • 打赏
  • 举报
回复
析构和构造都是有办法进行显示调用的。

析构直接写就可以了。

构造要通过replacement new
zh1369 2005-07-27
  • 打赏
  • 举报
回复
在任何情况下都 不需要主动调用 析构函数!
析构函数 在对象超出作用域时自动调用!
:》回去好好看看书,这是最基础的东西!
// pp.~tt();永远(有点绝对)也不能这样用
int main ()
{

tt pp;
pp.Show();
// pp.~tt();

return 0;
}
defyer007 2005-07-27
  • 打赏
  • 举报
回复
同意 steven99ca() ,如果你显示调用了一次,当对象的生存周期结束时,系统又自动调用它一次,这样的话,第一次释放了资源,那第二次干吗呢。
另外,我觉得这应该和编译器有关,比如楼主说在GCC中可以,那可能当你显示调用~tt()时,系统就将该对象标志为删除,下次就不会再调用了
Ffwflg 2005-07-27
  • 打赏
  • 举报
回复
你这个例子中的tt,~pp()在main退出的时候会被自动调用。
若你再显示调用一次,则这个函数被调用两次,第二次调用调用时,这行:
delete [] p;
会报错,你把~pp()写成这样运行是就不会报错了。
tt::~tt()
{
age =0;
if(p){
delete [] p;
p = NULL;
}
}
但问题是你还是两次调用了~pp(),不应该这样做的。

gcc不报错可能是用于一些附加的调试功能帮你处理了这个问题。
而从C++的语法来讲,~pp()一定会在对象生命期结束的时候被调用,你一般情况不需要显示调用。

只有在你希望对对象进行特别的管理时,你才需要显示调用~pp()函数,比如:自己申请一片连续内存,模拟内存管理,使用对象指针指向这个内存区域,则你可以也需要用这(些)对象指针显式调用这个类的构造、析构函数。
cchon 2005-07-27
  • 打赏
  • 举报
回复
可以这样用呀:
int main ()
{

{
tt pp;
pp.Show();
}
return 0;
}

dounier 2005-07-27
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/4169/4169901.xml?temp=.9504053
看这个帖子
xzgyb 2005-07-27
  • 打赏
  • 举报
回复
delete有两步操作
1.调用析构函数
2.调用operator delete释放内存

在c++里可以
显示调用析构函数

作用就是与
placement new相匹配

一般比如分配一段内存作为内存池

如下的

#include <iostream>
#include "tmp.h"

using namespace std;

class A {
public:
A( int i ) : _i( i ) { cout << "constructor\n"; }
void print() { cout << _i << endl; }

~A() { cout << "destructor\n"; }
private:
int _i;
};

char mem_pool[ 20 ];

int
main()
{
A * pa = new ( & mem_pool[ 0 ] ) A( 25 );
pa->print();

pa->~A();

return 0;
}

这种情况就不能用delete

yangwuhan 2005-07-27
  • 打赏
  • 举报
回复
我用vc6编译,没有出错,运行出错

tt::~tt()
{
age =0;
delete [] p;
p=0; //加了这个运行就不会出错了
}
benjiam 2005-07-27
  • 打赏
  • 举报
回复
Deconstructor is the same as other member functions, it won't erase itself

how to erase itself

64,688

社区成员

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

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