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

如题所述

首先我们需要理解:
1.默认复制构造函数不会创建临时对象,就像你自己定义的复制构造函数的参数是引用类型一样。
2.默认的复制构造函数是浅拷贝,也就是说如果被复制对象有一个内置指针成员,复制后的对象跟被复制的对象都有一个指向同一块内存的指针成员,即拷贝的是指针地址而不是内存。
3.基于第二点,如果析构函数有delete指针操作,那么只要任何一个对象被析构,则所有对象指向的这一块内存的空间被回收。
4.默认构造函数不会释放内置指针指向的内存空间。也就是说new出来的需要自己delete掉。追问

但我在看c++prime plus中,默认复制构造函数创建的临时对象过期时,调用了析构函数,但没有delete new出来的空间

追答

我说的不会创建临时对象是在构造期间。你说的这个临时对象应该是指,比如调用方法void set(A a);时,因为参数a不是引用类型,所以在调用时会进行隐式拷贝,即调用A类型的拷贝构造函数创建临时对象a,在set方法调用返回后,临时对象a会被销毁,即调用A类型的析构函数。我上面已经说过,默认的析构函数不会释放指针指向的内存。

追问

谢谢

温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-12-07
因为你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"; }本回答被网友采纳
相似回答