注册 登录
编程论坛 C++教室

关于显式调用类的析构函数

不是我的 发布于 2007-09-21 10:54, 1791 次点击
先定义一个类MyClass

class MyClass
{
char ch;
public:
MyClass(char c='E'){ch=c;};
~MyClass(){};
Show(){cout<<ch;};

};

然后在主函数里面代码如下:

MyClass test;
test.~MyClass();
test.Show();

运行结果: E

疑惑: 在对象调用成员函数Show()之前已经被析构掉了,对象已经不存在了要,怎么后面还能使用test这个对象呢?
13 回复
#2
PcrazyC2007-09-21 11:02
析构不代表对象已经结束,只是对象销毁的时候会调用析构函数,你不要弄反了
#3
valentineyzq2007-09-21 12:25
我从没试过这种用法,希望高手们讲得详细一些。
还有这段代码有什么实际意义吗?我觉得只是在给自己添麻烦……
#4
aipb20072007-09-21 12:39

析构就是销毁一个对象,至于你得到的“正确”结果,只是在你这个例子里的巧合。
销毁了,一切对该对象的操作都是未定义的。

#5
PcrazyC2007-09-21 18:34

显示调用析构函数根本没有销毁对象,就像调用普通函数一样,具体看析构函数中的语句是什么.比如下面这个例子


#include<iostream>

using namespace std;

class aa
{
private:
int *a;
public:
aa(){a=new int;*a=3;}
void print();
~aa(){delete(a);}
};
void aa::print()
{
cout<<*a<<endl;
}

int main()
{
aa b;
b.print();
b.~aa();//如果注释这句,a还是可以输出的,如果将其空间释放了,就会出现错误,析构函数一般情况是为了处理空间释放的问题,所以显示调用之后,里面的一些变量有可能不能用,所以存在一定的隐患
b.print();
return 0;
}

[此贴子已经被作者于2007-9-21 18:41:21编辑过]

#6
coachard2007-09-21 19:02
析构函数能显示调用???

还真没想过~~~~~~
#7
aipb20072007-09-21 22:04

到处看了下,众说纷纭,也许PcrasyC是对的。但是你那段代码我觉得不能证明这个问题。

我还是坚持我的,因为这样想更安全,也更规范!呵呵~

#8
PcrazyC2007-09-22 13:34

我认为我的是对的,我那段代码不是为了说明调用显示函数对象不会销毁,而是为了说明不要轻易的去显示调用析构函数,因为析构函数一般情况是为了处理空间释放,存在不完全的隐患,但在有些特殊情况下,显示调用析构函数会更加容易解决问题,比如用vector的方式去实现通用容器的时候,用这个方法很容易实现,但用其它方法就很难了

#9
nuciewth2007-09-22 13:40
说个假设
#include <stdio.h>
#include<malloc.h>
main()
{
int *p;
p=(int*)malloc(8);
*(p+3)=4;
free(p);
printf("%d",*(p+3));
}

#10
nuciewth2007-09-22 14:15
改成这样了.

#include<stdio.h>
#include<malloc.h>
int main()
{
int *p;
p=(int *)malloc(16);
*(p+3)=4;
free(p);
printf("%d\n",*(p+3));
return 0;
}
#11
nuciewth2007-09-22 15:18
再换
#include<stdio.h>
#include<malloc.h>
int main()
{
int *p;
p=(int *)malloc(16);
*p=4;
free(p);
printf("%d\n",*p);
return 0;
}
#12
海子星竹2007-09-22 18:49

以前从来没考虑过这样的问题
受教了
#13
warstar20082007-09-22 19:49
析构不代表对象已经结束,只是对象销毁的时候会调用析构函数
#14
china25qd2007-09-22 21:17
实在是~
怎么有JAVA混在里面?
1