c++中默认复制构造函数创建临时对象过期时调用析构函数,会不会释放被复制对象new出来空间

 我来答
繁简知音
2018-12-08 · TA获得超过174个赞
知道小有建树答主
回答量:168
采纳率:91%
帮助的人:110万
展开全部
首先我们需要理解:
1.默认复制构造函数不会创建临时对象,就像你自己定义的复制构造函数的参数是引用类型一样。
2.默认的复制构造函数是浅拷贝,也就是说如果被复制对象有一个内置指针成员,复制后的对象跟被复制的对象都有一个指向同一块内存的指针成员,即拷贝的是指针地址而不是内存。
3.基于第二点,如果析构函数有delete指针操作,那么只要任何一个对象被析构,则所有对象指向的这一块内存的空间被回收。
4.默认构造函数不会释放内置指针指向的内存空间。也就是说new出来的需要自己delete掉。
更多追问追答
追问
但我在看c++prime plus中,默认复制构造函数创建的临时对象过期时,调用了析构函数,但没有delete  new出来的空间
追答
我说的不会创建临时对象是在构造期间。你说的这个临时对象应该是指,比如调用方法void set(A a);时,因为参数a不是引用类型,所以在调用时会进行隐式拷贝,即调用A类型的拷贝构造函数创建临时对象a,在set方法调用返回后,临时对象a会被销毁,即调用A类型的析构函数。我上面已经说过,默认的析构函数不会释放指针指向的内存。
百度网友bcee5c2
2018-12-07 · TA获得超过1959个赞
知道大有可为答主
回答量:5621
采纳率:84%
帮助的人:272万
展开全部
因为你people的构造函数里构造和析构了一个date对象: people() { cout<>number; cout<>sex; date birthday(1); cout<>id; cout<<"对象初始化完成!\n"; }; 上面这个birthday是新创建的一个局部对象,构造函数退出的时候就会释放,所以析构函数被调用了应该改成: people() : birthday(1) { cout<>number; cout<>sex; cout<>id; cout<<"对象初始化完成!\n"; }
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式