关于C++中深层复制的问题

maoxing63570 2010-04-13 11:37:01
#include "iostream"
using namespace std;
class A
{
public:
A()
{
x=new int;
*x=5;
cout<<"执行构造函数……\n";
}
A(A&a)
{
x=new int;
*x=*(a.x);
cout<<"复制函数执行……\n";
}
~A()
{
delete x;
cout<<"析构函数执行中……\n";
}
int Print()const
{
return *x;
}
void set(int i)
{
*x=i;
}
private:
int *x;
};
void main ()
{
A *p=new A;
cout<<p->Print()<<endl;
A b=*p;
cout<<b.Print()<<endl;
p->set(99);
cout<<p->Print()<<endl;
return;
}
在这段代码中,我没加上delete p;这条语句,它就只调用了析构函数来析构了对象b,如果我加上delete p;则会调用析构函数2次来分别析构对象p和对象b,我想问的是,析构函数不是在主函数返回前被自动调用来析构所有的对象么?为什么我不加delete p,它就不析构对象p,而只析构对象b呢?
...全文
70 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
camelisi 2010-04-13
  • 打赏
  • 举报
回复
楼上正解
Learn-anything 2010-04-13
  • 打赏
  • 举报
回复
p是你new出来的,你不delete,p是不会析构的,b不一样,他不是new出来的,只是放在栈中的,main作用域结束了,自动调用b的析构函数析构。
jamseyang 2010-04-13
  • 打赏
  • 举报
回复
lz可以研究下string类的源代码
jamseyang 2010-04-13
  • 打赏
  • 举报
回复
是这样的!
maoxing63570 2010-04-13
  • 打赏
  • 举报
回复
那么对于栈中的元素来说弹出堆栈后不是就没用了么,换句话说,也就是不要手动来释放的啊。堆中的对象才需要手动来释放。不知道我的理解是不是真确的,因为我才开始学c++,以前学的是c#。

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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