RAII:C++中一个对象出了其作用域就会被自动析构,只要在构造函数时候申请空间,析构函数时候释放空间,围绕着构造和析构进行操作。
深拷贝:每一个对象的指针都有指向的内存空间,而不是共享,对象析构时不存在重复释放或者内存泄漏的问题;内存开销大
浅拷贝: 通过 拷贝构造函数实例化的对象的指针数据变量指向的共享的内存空间,内存开销小;对象析构时可能会重复释放或造成内存泄漏。
通过引用计数,减少了内存开销,又避免了堆的重复释放或者内存泄漏问题
引用计数复用了深拷贝和浅拷贝的优点,避免了缺点,同时带来了新的问题:
1 其中某一个对象中资源进行了修改,所有引用该资源的对象全部被修改
2复用性不好
使用写时拷贝解决问题:共享资源发送变化时,对资源进行拷贝,修改拷贝的值,不影响原有的对象的共享资源。
智能指针:
用起来像指针,会自己对资源进行释放;将资源放入智能指针类中,管理起来
shared_ptr:
共享的智能指针,每一个shared_ptr的拷贝都指向相同的内存,最后一个shared_ptr析构的时候,内存才会被释放。
可以通过构造函数,std_make_shared辅助函数和reset方法来初始化shared_ptr;
unique_ptr:
独占的智能指针,不允许其他职能指针共享内部的指针,不允许通过赋值将一个unique_ptr赋值给另外一个unique_ptr;不允许复制,可以通过函数返回给其他的unique_ptr,还可以通过move转移到其他的unqiue_ptr,这样它本身就不在拥有原来指针的所有权了。
若希望只有一个智能指针管理资源或者管理数组就是有unique_ptr,如果希望多个智能指针管理同一个资源就用shared_ptr。
weak_ptr:
弱引用的智能指针, 此指针用来监视share_ptr,不会使引用计数加1,它不管理shared_ptr内部的指针,主要为了监视shared_ptr的生命周期,更像是shread_ptr的一个助手。
weak_ptr没有重载运算符*和->,因为他不共享指针,不能操作资源,主要通过shared_ptr获得资源的检测权,构造不会增加引用计数,释放不会减少引用计数,纯粹作为一个旁观者监视shared_ptr中关联的资源是否存在。
还可以用来返回this指针和解决循环引用的问题。