免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5799 | 回复: 6
打印 上一主题 下一主题

stl容器可以自动析构对象? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-14 11:57 |只看该作者 |倒序浏览
比如 下面这种 :

class A{

A():p(NULL){};

~A(){if(p) delete[] p};

char* p;

};


int main()
{
  
A a;
a.p=new char[10];
strcpy(a.p,"12345");

vector<A> *va=new vector<A>();
va->push_back(a);

&nbsp;&nbsp;delete va;

return 0;
}



书上说 delete会有问题  会造成2次释放对象 我不是很理解 能否解释一下  谢谢

论坛徽章:
0
2 [报告]
发表于 2008-09-14 12:00 |只看该作者
这个delete是要的,问题是A需要定义一个拷贝构造函数。系统默认的拷贝构造函数是浅拷贝。

论坛徽章:
0
3 [报告]
发表于 2008-09-14 13:21 |只看该作者
谢谢楼上 我去查了些资料  干脆都贴出来

默认的拷贝构造函数只能实现浅拷贝,浅拷贝会带来安全的隐患。要实现深拷贝必须编写拷贝构造函数

如果没有指针,就没有浅拷贝与深拷贝!   
  看下面的类:   
  struct   A   
  {   
          int   n;   
  };   
  在类A的两个对象之间进行拷贝时,没有浅拷贝与深拷贝的说法。   
  再看下面的类:   
  struct   B   
  {   
          int*   p;   
  };   
  在类B的两个对象之间进行拷贝时,分为两种情况:   
  1、浅拷贝   
          B   x,   y;   
          y.p   =   new   int;   
          *y.p   =   10;   
          //   浅拷贝代码段   
          {   
                  x.p   =   y.p;     //   则有:*x.p   =   10   
          }   
          delete   y.p;   //   合法   
          delete   x.p;   //   非法   
  2、深拷贝   
          B   x,   y;   
          y.p   =   new   int;   
          *y.p   =   10;   
          //   深拷贝代码段   
          {   
                  x.p   =   new   int;   
                  *x.p   =   *y.p;   //   亦有:*x.p   =   10;   
          }   
          delete   y.p;   //   合法   
          delete   x.p;   //   合法   
   
  可见,浅拷贝指的是'指针'拷贝,深拷贝指的是'值'拷贝。

论坛徽章:
0
4 [报告]
发表于 2008-09-14 13:51 |只看该作者
我的理解是 当delete vector指针时,会析构传入vector的对象a的拷贝  由于是浅拷贝 传递的是

指针进去  会把a对象里分配的内存进行释放


当程序退出的时候 会再次释放a对象里的内存  出现2次内存释放 出错

论坛徽章:
0
5 [报告]
发表于 2008-09-21 16:43 |只看该作者

回复 #3 wilbur512 的帖子

你还没有理解。。。
c++中很多设计是为了避免代码出现的问题

论坛徽章:
0
6 [报告]
发表于 2008-09-21 23:33 |只看该作者
原帖由 nbkjbo 于 2008-9-21 16:43 发表
你还没有理解。。。
c++中很多设计是为了避免代码出现的问题



??? 那你说一下呢?

论坛徽章:
0
7 [报告]
发表于 2008-09-22 09:26 |只看该作者
以为是浅拷贝,所以在va->push_back(a);时候,有产生了一个和a.p指向同一块内存的指针,这个程序会在删除va,和程序结束删除a时,两次释放这块内存。

if(p) delete[] p;并不能避免二次释放的问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP