| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1788 人关注过本帖
标题:关于显式调用类的析构函数
只看楼主 加入收藏
不是我的
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2007-8-25
收藏
 问题点数:0 回复次数:13 
关于显式调用类的析构函数
先定义一个类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这个对象呢?
搜索更多相关主题的帖子: 式调 函数 
2007-09-21 10:54
PcrazyC
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:5652
专家分:0
注 册:2006-10-20
收藏
得分:0 
析构不代表对象已经结束,只是对象销毁的时候会调用析构函数,你不要弄反了

雁无留踪之意,水无取影之心
2007-09-21 11:02
valentineyzq
Rank: 1
等 级:新手上路
威 望:1
帖 子:69
专家分:0
注 册:2007-8-21
收藏
得分:0 
我从没试过这种用法,希望高手们讲得详细一些。
还有这段代码有什么实际意义吗?我觉得只是在给自己添麻烦……

我的世界曾经下过一场倾盆大雨。
2007-09-21 12:25
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 

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


Fight  to win  or  die...
2007-09-21 12:39
PcrazyC
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:5652
专家分:0
注 册:2006-10-20
收藏
得分:0 

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


#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编辑过]


雁无留踪之意,水无取影之心
2007-09-21 18:34
coachard
Rank: 3Rank: 3
等 级:新手上路
威 望:7
帖 子:1251
专家分:0
注 册:2007-8-12
收藏
得分:0 
析构函数能显示调用???

还真没想过~~~~~~

偶学编程,也许本身就是一个错。。。
2007-09-21 19:02
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 

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

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


Fight  to win  or  die...
2007-09-21 22:04
PcrazyC
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:5652
专家分:0
注 册:2006-10-20
收藏
得分:0 

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


雁无留踪之意,水无取影之心
2007-09-22 13:34
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
说个假设
#include <stdio.h>
#include<malloc.h>
main()
{
int *p;
p=(int*)malloc(8);
*(p+3)=4;
free(p);
printf("%d",*(p+3));
}


倚天照海花无数,流水高山心自知。
2007-09-22 13:40
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
改成这样了.

#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;
}

倚天照海花无数,流水高山心自知。
2007-09-22 14:15
快速回复:关于显式调用类的析构函数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012583 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved