要正确理解智能指针,首先必须理解引用计数技术。
深拷贝、浅拷贝的概念
深拷贝的优缺点:
优点:每一个对象(哪怕是通过拷贝构造函数实例化的对象)的指针都有指向的内存空间而不是共享,所以在对象析构的时候就不存在重复释放或内存泄漏的问题了。
缺点:内存开销大
- 注解:假如是a="hello,"; b="world!"; 现在要执行拷贝行为:b=a; 如果是深拷贝(不用默认的拷贝构造,而是自己写的拷贝构造),则首先为b动态分配和a所占用内存空间一样大小的内存空间,然后执行字符串复制, 把a的内容复制给b,这样a和b就会指向各自的内存空间。
浅拷贝优缺点:
优点:通过拷贝构造函数实例化的对象的指针数据变量指向共享的内存空间,因此内存开销较小。
缺点:对象析构的时候可能会重复释放或者造成内存泄漏。
- 注解:假如是a="hello,"; b="world!"; 现在要执行拷贝行为:b=a; 如果是浅拷贝(用默认的拷贝构造,而不是自己写的拷贝构造),则b会指向a指向的内存空间,这样a和b就会指向相同的内存空间,从而在拷贝的时候会造成内存泄漏,因为b此时改变了指向,那它原来指向的内存空间("world!")就变成了"孤儿"。
思考:能不能把深拷贝和浅拷贝的有点结合起来呢?结合它们的优点,避开它们各自的缺点。
举例说明:
在深拷贝的情况下,通过拷贝构造或者拷贝赋值构造的对象均各自包含自己的指针指向"hello"。
显然,这样比较浪费内存,存在冗余,那么下面的版本更好:
注解:
- 它们使用同一块内存(资源)。
- 但是,此时对其中任一个变量的操作都会影响其它变量指向的内容。
- 释放任何一个变量的内存,其他的变量也同时被释放,这个叫重复释放问题。