浅拷贝 为什么只析构一次

pandongbo1234 2012-09-07 09:11:49
#include<iostream>
using namespace std;
class A
{
public:
A()
{x =new int;*x = 5;cout<<"构造函数执行"<<endl;}
~A()
{delete x;cout<<"析构函数执行"<<endl;}
A(A& a)
{x = a.x;cout<<"复制构造函数执行"<<endl;}

private:
int *x;
};

int main()
{

A* a = new A();
A b =*a;
return 0;
}

结果是
构造函数执行
复制构造函数执行
析构函数执行

为什么析构函数只执行了一次呢。另外的一次哪去了?大侠帮忙,小弟求教

...全文
111 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
mrliu8023 2012-09-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 donglipeng2009 的回复:]
A* a = new A();
这个你是动态的内存, 要手动delete。
虽然这个没泄露是因为程序退出,堆中的内存被释放,而不是因为析构函数的问题

这个不是由于浅拷贝造成的 而且你这么写析构会出错的。 会 重复删除指针 在运行时报错

if(x != NULL)
delete x;
X=NULL;
[/Quote]
C++会保证你delete NULL 指针不会报错 只是什么都不做
linux-novice 2012-09-07
  • 打赏
  • 举报
回复
A* a = new A();
这个你是动态的内存, 要手动delete。
虽然这个没泄露是因为程序退出,堆中的内存被释放,而不是因为析构函数的问题

这个不是由于浅拷贝造成的 而且你这么写析构会出错的。 会 重复删除指针 在运行时报错

if(x != NULL)
delete x;
X=NULL;
yuanfang2014 2012-09-07
  • 打赏
  • 举报
回复
new分配的内存,不会自动释放,当你用Delete去释放时,就会导致内存溢出了
xmu_才盛 2012-09-07
  • 打赏
  • 举报
回复
没有delete, 堆中的内存当然释放不了
pandongbo1234 2012-09-07
  • 打赏
  • 举报
回复
嗯。new出来的东西必须 用delete才能析构。
merlin_q 2012-09-07
  • 打赏
  • 举报
回复
问题是new出来的对象调用delete a会析构, 但是你这里的浅拷贝会在b析构的时候释放掉x, 如果再调用delete a的话估计是会报错了。
Mr_defy_L 2012-09-07
  • 打赏
  • 举报
回复
我也不大明白。看楼下的
我觉得你这个例子不好,哪里new哪里delete
怎么轮得到类里面去delete,如果你传递不是个动态的对象呢,后果很严重

64,649

社区成员

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

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