浅拷贝和深拷贝
来源:互联网 发布:如何在u盘上安装ubuntu 编辑:程序博客网 时间:2024/04/30 16:14
class A{public: A(char * p1 = NULL) { if (p1 == NULL) { p = new char[1]; p[0] = '\0'; } else { p = new char[strlen(p1) + 1]; strcpy(p, p1); } } ~A() { delete[]p; cout << "destruction" << endl; }private: char * p;};int main(){ A a("hello"); A b(a);}
程序运行时出错
这是因为默认的拷贝构造(默认的赋值函数也一样)只是复制了指针(浅拷贝),指向了同一片内存,这样在a,b生命周期结束的时候,会delete这个内存两次,导致程序运行出错,增加以下的代码即可
A(const A& tmp)(深拷贝) { p = new char[strlen(tmp.p) + 1]; strcpy(p, tmp.p); }
总结:浅拷贝只是复制了指针,并没有新分配内存,而深拷贝新分配了内存,并将数据复制了过来
阅读全文
0 0
- 浅拷贝和深拷贝
- 浅拷贝和深拷贝
- 浅拷贝和深拷贝
- 深拷贝和浅拷贝
- 深拷贝和浅拷贝
- 深拷贝和浅拷贝
- 浅拷贝和深拷贝
- 浅拷贝和深拷贝
- 深拷贝和浅拷贝
- 深拷贝和浅拷贝
- 浅拷贝和深拷贝
- 浅拷贝和深拷贝
- 浅拷贝和深拷贝
- 深拷贝 和 浅拷贝
- 浅拷贝和深拷贝
- 浅拷贝和深拷贝
- 深拷贝和浅拷贝
- 深拷贝和浅拷贝
- maven配置的简单介绍
- avalon实现if-else
- css3
- git学习1
- 详解java中的abstract class和interface的区别
- 浅拷贝和深拷贝
- Springboot+redis 整合
- 最大子段和问题
- C#特性(Attribute)
- TPC-DS标准规范(一)
- vue2-微信分享踩的坑
- UVA
- E
- Approximating a Constant Range CodeForces