c++智能指针整理

std::auto_ptr

这是一种简单的智能指针
auto_ptr是C++标准库中(<utility>)为了解决资源泄漏的问题提供的一个智能指针类模板(注意:这只是一种简单的智能指针)
auto_ptr的实现原理其实就是RAII,在构造的时候获取资源,在析构的时候释放资源,并进行相关指针操作的重载,使用起来就像普通的指针。
主要用法分为三类
用法一:  
std::auto_ptr<MyClass>m_example(new MyClass());  
用法二:  
std::auto_ptr<MyClass>m_example;  
m_example.reset(new MyClass());  
 用法三(指针的赋值操作):  
std::auto_ptr<MyClass>m_example1(new MyClass());  
std::auto_ptr<MyClass>m_example2(new MyClass());  
m_example2=m_example1;  

缺陷容器类型不能为此类型,容器的操作中一般情况下都会有赋值,赋值会导致原有的指针指像NULL;
不要试图用两个auto管理一个资源这回导致释放时的指针悬挂问题。
因为auto_ptr 使用的是delete释放内存,所以尽量 不要让它指向一个非内置类型的数组。
1,auto_ptr存储的指针应该为NULL或者指向动态分配的内存块。
2,auto_ptr存储的指针应该指向单一物件(是new出来的,而不是new[]出来的)。
3,两个auto_ptr对象不会同时指向同一块内存块。要明白2个auto_ptr对象赋值会发生什么。
4,千万不要把auto_ptr对象放在容器中。

5,当将auto_ptr作为函数参数时,最好声明为const auto_ptr<T>&(by const ref).当函数返回值可以简单的传值(by value).


std::scoped_ptr
scoped_ptr是一个类似于auto_ptr的智能指针,它包装了new操作符在堆上分配的动态对象,能够保证动态创建的对象在任何时候都可以被正确的删除。但是scoped_ptr的所有权更加严格,不能转让,一旦scoped_pstr获取了对象的管理权,你就无法再从它那里取回来
scoped_ptr和auto_ptr一样不能用作容器的元素,但原因不同:auto_ptr是因为它的转移语义而scoped_ptr则是因为不支持拷贝和赋值,不符合容器对元素类型的要求。
share_ptr:(多线程下的安全问题请参考陈硕博文http://blog.csdn.net/solstice/article/details/8547547


shared_ptr 是一个标准的共享所有权的智能指针, 允许多个指针指向同一个对象. 定义在 memory 文件中(非memory.h), 命名空间为 std.
shared_ptr 是为了解决 auto_ptr 在对象所有权上的局限性(auto_ptr 是独占的), 在使用引用计数的机制上提供了可以共享所有权的智能指针, 当然这需要额外的开销:
(1) shared_ptr 对象除了包括一个所拥有对象的指针外, 还必须包括一个引用计数代理对象的指针.
(2) 时间上的开销主要在初始化和拷贝操作上, *和->操作符重载的开销跟auto_ptr是一样.
(3) 开销并不是我们不使用shared_ptr的理由, 永远不要进行不成熟的优化, 直到性能分析器告诉你这一点.
使用场景
1 对象之间“共享数据”,对象创建与销毁“分离” 
2 放入容器中的动态对象,使用shared_ptr包装,比unique_ptr更合适 
4.3 管理“动态数组”时,需要制定Deleter以使用delete[]操作符销毁内存,因为shared_ptr并没有针对数组的特化版本(unique_ptr有针对数组的特化版本)
缺点:
交叉引用问题
多线程效率低下问题 
share_ptr 指向this指针共享对象时enable_shared_from_this防止多次析构
同一个share_ptr多线程进行读写时必须要加锁
多个share_ptr指向同一个对象多线程读写安全
多个share_ptr 不能同时引用同一块内存。
一种情况如下  race condition。
shared_ptr<Foo> g(new Foo); // 线程之间共享的 shared_ptr
shared_ptr<Foo> x; // 线程 A 的局部变量
shared_ptr<Foo> n(new Foo); // 线程 B 的局部变量
x=g
g=n

是想一种情况在A线程中如果执行x=g当没执行完 然后切换到b线程g=n当两个执行完成之后会出现FOO对象会被析构然后在执行A进程,导致指针的悬挂问题。

weak_ptr










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值