C++智能指针简述
auto_ptr
- 设计目的:超出作用域,自动释放内存。
- 所有权传递:拷贝auto_ptr时,原指针失效,释放所有权;新指针获得所有权。总而言之,允许通过拷贝转移所有权,独占所有权。
- 缺陷:这个指针使用起来容易出bug。因为这个指针拷贝以后,原指针会被重置,而导致失效,无法继续使用,如果继续使用,就会导致崩溃。所以auto_ptr被淘汰了,不要用它。
unique_ptr
- 设计目的:超出作用域,自动释放内存,用来代替auto_ptr。
- 所有权传递:禁止拷贝,只支持通过移动语义传递所有权。通过移动语义传递所有权时,原指针失效,释放所有权;新指针获得所有权。总而言之,只允许通过移动构造转移所有权,不允许拷贝,独占所有权。为什么不支持拷贝,因为所有权传递,更符合移动语义,拷贝是原意是生成一个副本指针,不改变原指针,但是因为独占所有权,所以原指针会被重置为空指针,不符合拷贝的含义。需要注意的是unique_ptr可以作为函数返回值返回,这是因为,返回值可以支持移动语义。
scoped_ptr
- 设计目的:超出作用域,自动释放内存。
- 所有权传递:禁止拷贝,不支持传递所有权,只支持交换所有权。总而言之,禁止所有权转移,允许所有权交换。
shared_ptr
- 中文名:强指针。
- 设计目的:引用计数减到0,自动释放内存。
- 所有权传递:允许拷贝,允许多个shared_ptr共享同一个动态创建的对象的所有权。
- 缺点:互相持有对方实例的shared_ptr时,会导致循环引用问题,导致两个shared_ptr都无法释放内存。
weak_ptr
中文名:弱指针。
- 设计目的:解决强指针循环引用问题。
- 所有权:不持有任何所有权,仅进行所有权查询。但是可以转换为强指针。