析构的本质是什么??

luozuwu 2009-12-03 08:51:03
析构某个对象后,只是告诉编译器这一块内存不再为某个对象独占了,你可以访问它,别的对象或者变量也可以访问它并使用该内存区域存储他们的数据,但是在他们使用之前,存放在该内存区域的数据并没有删除,此时用指针能访问里面的数据(前提是没有写入新的数据)。
以上理解正确不???
有代码为证:
#include<iostream>
using namespace std;
class A
{
public:
A(int i){x=i;cout<<"constructing"<<endl;}
A(A &a){this->x=a.x;cout<<"copying"<<endl;}
~A(){cout<<"destructing"<<endl;}
int get(){return x;}
private:
int x;

};
A func()
{
cout<<"func called"<<endl;
A a(23);
cout<<"the address of a "<<&a<<endl;
return a;
}
void main()
{
A *r=&func();
cout<<"the copy of a address "<<r<<endl;
cout<<r->get()<<endl;

}
输出结果:
输出结果中第二,三行的destructing 是不是代表析构局部对象a和临时对象(a的一个副本,调用函数func()后产生的),此时临时对象不是最后析构的?
如果是,r为什么还能访问该临时对象??
还有一说法,对临时对象的引用可以扩大该临时变量的生存期.
改成:#include<iostream>
using namespace std;
class A
{
public:
A(int i){x=i;cout<<"constructing"<<endl;}
A(A &a){this->x=a.x;cout<<"copying"<<endl;}
~A(){cout<<"destructing"<<endl;}
int get(){return x;}
private:
int x;

};
A func()
{
cout<<"func called"<<endl;
A a(23);
cout<<"the address of a "<<&a<<endl;
return a;
}
void main()
{
A &r=func();
cout<<"the copy of a address "<<&r<<endl;
cout<<r.get()<<endl;

}
输出结果中第一次析构局部变量a,最后析构临时变量(调用func()函数后产生的)!!
此时临时变量的生存期扩大了???
如果把此临时对象赋值给其他对象,该临时变量好像没有析构了?
代码:#include<iostream>
using namespace std;
class A
{
public:
A(int i){x=i;cout<<"constructing"<<endl;}
A(A &a){this->x=a.x;cout<<"copying"<<endl;}
~A(){cout<<"destructing"<<endl;}
int get(){return x;}
private:
int x;

};
A func()
{
cout<<"func called"<<endl;
A a(23);
cout<<"the address of a "<<&a<<endl;
return a;
}
void main()
{
A r=func();
cout<<"the copy of a address "<<&r<<endl;
cout<<r.get()<<endl;

}
输出结果中临时对象好像没有析构的,析构的应该是局部对象a和对象r(理论上是调用拷贝构造函数创建对象r,可是编译器给优化了)??
以上三个程序中的临时对象生存期为什么不同??
临时对象的生存期到底是怎样的??
还望各位详细解答,如果能解决困扰我已久的问题,鄙人感激不尽!!!
...全文
327 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
starcat 2009-12-03
  • 打赏
  • 举报
回复
相当于free() or delete
kostion 2009-12-03
  • 打赏
  • 举报
回复
就是打扫战场的函数,释放资源等等
chin_chen 2009-12-03
  • 打赏
  • 举报
回复
你太牛b了[Quote=引用 10 楼 hemiya 的回复:]
会自动执行的函数
[/Quote]
hemiya 2009-12-03
  • 打赏
  • 举报
回复
会自动执行的函数
liuxmzc 2009-12-03
  • 打赏
  • 举报
回复
相比较,第二种情况算是临时变量生命期扩大,第一种算是非法使用。第二种情况不是没有析构,只不过析构的时间稍微晚些,在退出main函数时还是会析构的,如果你此时把该对象赋值给其他对象,这就到了第一种情况了。
情况三与情况二类似,一样析构。
guanjing84106 2009-12-03
  • 打赏
  • 举报
回复
A(A &a){this->x=a.x;cout < <"copying" < <endl;} 这行是好像只有在return a时被调用,照这么说的话没有A(A &a){this->x=a.x;cout < <"copying" < <endl;}这个那函数func()还无法返回一个class A啦~~
请多多指教,有点无法理解
hityct1 2009-12-03
  • 打赏
  • 举报
回复
析构只是释放内存的使用权,并不是将释放的内存清零。
hai040 2009-12-03
  • 打赏
  • 举报
回复
析构函数除了是在对象生存期结束时自动调用外
与普通函数没大区别
pengzhixi 2009-12-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 liuxmzc 的回复:]
先回答下第一问:析构后存放在该内存区域的数据并没有删除。
[/Quote]
只是还没有其他的代码污染这块内存而已。并不代表这块内存你可用
The_facE 2009-12-03
  • 打赏
  • 举报
回复
不同的编译器对函数返回对象的解释是不同的,所以有没有临时变量都是一个问题。
liuxmzc 2009-12-03
  • 打赏
  • 举报
回复
先回答下第一问:析构后存放在该内存区域的数据并没有删除。
pengzhixi 2009-12-03
  • 打赏
  • 举报
回复
那要看你的析构函数里面的内容了,无非就是销毁对象,返还内存。
starix_cai 2009-12-03
  • 打赏
  • 举报
回复
楼主最好把输出也贴出来。我用g++编译,第一段程序的输出只显示了一次析构。第二、三段程序均通不过编译。
Julykey 2009-12-03
  • 打赏
  • 举报
回复
就是释放占有的那块内存,从此后,这块内存就又可以被其他程序占用了
lovesi3344 2009-12-03
  • 打赏
  • 举报
回复
成员复制是浅复制 成员拷贝是浅拷贝
指针赋值是浅复制 指针拷贝是浅拷贝
析构是浅删除 删除对象,但是new申请的空间还是没有删除,要删除new申请的空间必须delete
ketet 2009-12-03
  • 打赏
  • 举报
回复
本质就是释放资源
a452325305 2009-12-03
  • 打赏
  • 举报
回复
只是交出内存使用权 OS不会帮你清理内存中的内容
所以在一定条件下 即使释放掉使用权 去读取该地址的内容依然没变

由于目前系统都比较复杂,LZ在测试的时候可能还有其他进程在运行 所以得到的结果不能说明问题
除非你是在嵌入式中非常简单的系统上 才容易验证
eyodo8 2009-12-03
  • 打赏
  • 举报
回复
7楼14楼的说法正确
yangxxxxxx66 2009-12-03
  • 打赏
  • 举报
回复
析构还有一个作用,在打扫完以后去调用别的函数
cir2633 2009-12-03
  • 打赏
  • 举报
回复
内存不写零,只是os认为这块区域内被再次利用了

64,648

社区成员

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

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