c++中默认复制构造函数创建临时对象过期时调用析构函数,会不会释放被复制对象new出来空间
展开全部
首先我们需要理解:
1.默认复制构造函数不会创建临时对象,就像你自己定义的复制构造函数的参数是引用类型一样。
2.默认的复制构造函数是浅拷贝,也就是说如果被复制对象有一个内置指针成员,复制后的对象跟被复制的对象都有一个指向同一块内存的指针成员,即拷贝的是指针地址而不是内存。
3.基于第二点,如果析构函数有delete指针操作,那么只要任何一个对象被析构,则所有对象指向的这一块内存的空间被回收。
4.默认构造函数不会释放内置指针指向的内存空间。也就是说new出来的需要自己delete掉。
1.默认复制构造函数不会创建临时对象,就像你自己定义的复制构造函数的参数是引用类型一样。
2.默认的复制构造函数是浅拷贝,也就是说如果被复制对象有一个内置指针成员,复制后的对象跟被复制的对象都有一个指向同一块内存的指针成员,即拷贝的是指针地址而不是内存。
3.基于第二点,如果析构函数有delete指针操作,那么只要任何一个对象被析构,则所有对象指向的这一块内存的空间被回收。
4.默认构造函数不会释放内置指针指向的内存空间。也就是说new出来的需要自己delete掉。
更多追问追答
追问
但我在看c++prime plus中,默认复制构造函数创建的临时对象过期时,调用了析构函数,但没有delete new出来的空间
追答
我说的不会创建临时对象是在构造期间。你说的这个临时对象应该是指,比如调用方法void set(A a);时,因为参数a不是引用类型,所以在调用时会进行隐式拷贝,即调用A类型的拷贝构造函数创建临时对象a,在set方法调用返回后,临时对象a会被销毁,即调用A类型的析构函数。我上面已经说过,默认的析构函数不会释放指针指向的内存。
展开全部
因为你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"; }
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询