C++ 深拷贝/浅拷贝
来源:互联网 发布:相片视频制作软件 编辑:程序博客网 时间:2024/06/10 03:50
浅拷贝就是对象的数据成员之间的简单赋值,如你设计了一个没有类而没有提供它的复制构造函数,当用该类的一个对象去给令一个对象赋值时所执行的过程就是浅拷贝,如:
class A { public: A(int _data) : data(_data){} A(){}private: int data; };int main() { A a(5), b = a; // 仅仅是数据成员之间的赋值 }
这一句b = a;就是浅拷贝,执行完这句后b.data = 5;
如果对象中没有其他的资源(如:堆,文件,系统资源等),则深拷贝和浅拷贝没有什么区别,但当对象中有这些资源时,例子:
class A { public: A(int _size) : size(_size){ data = new int[size]; } // 假如其中有一段动态分配的内存 A(){}; ~A(){delete [] data;} // 析构时释放资源private: int* data; int size; };int main() { A a(5), b = a; // 注意这一句 }
这里的b = a会造成未定义行为,因为类A中的复制构造函数是编译器生成的,所以b = a执行的是一个浅拷贝过程。我说过浅拷贝是对象数据之间的简单赋值,比如:
b.size = a.size; b.data = a.data; // Oops!
这里b的指针data和a的指针指向了堆上的同一块内存,a和b析构时,b先把其data指向的动态分配的内存释放了一次,而后a析构时又将这块已经被释放过的内存再释放一次。
对同一块动态内存执行2次以上释放的结果是未定义的,所以这将导致内存泄露或程序崩溃。
所以这里就需要深拷贝来解决这个问题,深拷贝指的就是当拷贝对象中有对其他资源(如堆、文件、系统等)的引用时(引用可以是指针或引用)时,对象的另开辟一块新的资源,而不再对拷贝对象中有对其他资源的引用的指针或引用进行单纯的赋值。如:
class A { public: A(int _size) : size(_size){data = new int[size];} // 假如其中有一段动态分配的内存 A(){}; A(const A& _A) : size(_A.size){data = new int[size];} // 深拷贝 ~A(){delete [] data;} // 析构时释放资源private: int* data; int size; };int main() { A a(5), b = a; // 这次就没问题了 }
总结:
深拷贝和浅拷贝的区别是在对象状态中包含其它对象的引用的时候,当拷贝一个对象时,如果需要拷贝这个对象引用的对象,则是深拷贝,否则是浅拷贝。
- c++:什么是深拷贝什么是浅拷贝!
- OBJ-C 深拷贝 浅拷贝
- Object-c 深拷贝和浅拷贝
- c++-深拷贝与浅拷贝
- [Objective-C]浅拷贝和深拷贝
- 【c++】浅拷贝与深拷贝
- Objective-C 深拷贝与浅拷贝
- 【C++】深拷贝和浅拷贝
- 【C++】深拷贝和浅拷贝
- Objective-C浅拷贝和深拷贝
- 【C++】深拷贝和浅拷贝解析
- C中的深拷贝和浅拷贝
- [c++]深拷贝和浅拷贝
- [C++]深拷贝与浅拷贝
- 5.c++-拷贝构造函数(深拷贝,浅拷贝)
- c++_拷贝构造函数/浅拷贝/深拷贝
- 【C++】深拷贝、浅拷贝和写时拷贝
- 深拷贝&&浅拷贝
- 10款iOS高效开发必备的Objective-C类库
- Winform中修改WebBrowser控件User-Agent的方法
- POJ 2230 Watchcow(欧拉回路+DFS)
- python出二进制数表达了,挺不错的,不用十六进制来模拟了
- Arcgis9.3升级到10.1过程中错误“无法加载 DLL,ArcGISVersion.dll: 找不到指定的模块”解决方案
- C++ 深拷贝/浅拷贝
- flash性能优化
- NYOJ - 找球号(二)(HASH)
- 用UL制作横向CSS导航菜单
- Java反射机制的学习
- 二 类的声明和定义
- ddns简介
- 条件变量pthread_cond_t怎么用
- 黑马程序员 线程