智能指针区别与使用

                                   智能指针区别与使用

智能指针(类模板):
推荐博客:http://bolg,csdn.net/kongkongkkk/article/details/75135327
智能指针生存的意义就是为粗心的程序员以及不合理的程序,例如异常情况跳出了某一个空间的
释放代码段没有执行释放内存的代码。而使用智能指针则为了让指针自动处理以上问题保证内存
不易泄露。

*****不带应用计数
   ***********auto_ptr(c++)#include<memory> *************
*这个事基本的智能指针,它把指针封装成了一个类对象。利用系统对栈上对象自动析构的特点,在
出了作用域后自动析构这个指针,防止内存泄露。
*注意这个指针的构造函数做了explicit声明,所以我们不能auto_ptr<int> a=new int;必须要用
auto_ptr<int> a(new int);
*当所有权转让,原来的对象将会析构。这就保证一个资源只有一个auto_ptr与之对应,不能用于容器当中。
因为如果这样做我vector<auto_ptr>(10).我在做拷贝构造或者给新的vec赋值原来容器里面对象就没有了,
这显然不符合我们stl的要求。
   *********scoped_ptr(boost)********************
与auto_ptr的区别
不能转换所有权
boost::scoped_ptr所管理的对象生命周期仅仅局限于一个区间(该指针所在的"{}"之间),无法
传到区间之外,这就意味着boost::scoped_ptr对象是不能作为函数的返回值的(std::auto_ptr可以)。
其他和我们的auto_ptr类似。
由于boost::scoped_ptr是通过delete来删除所管理对象的,而数组对象必须通过deletep[]来删除,因此boost::scoped_ptr
是不能管理数组对象的,如果要管理数组对象需要使用boost::scoped_array类。
   *********unique_ptr(boost)*******************888
unique_ptr<int> ap(new int(88 );
unique_ptr<int> one (ap) ; // 会出错
unique_ptr<int> two = one;//会出错
unique_ptr没有这两个函数,如果想经行如上操作可按如下两种方法:
1.unique_ptr<int> GetVal( )
{
unique_ptr<int> up(new int(88 );
return up;
}
unique_ptr<int> uPtr =GetVal();   //ok
2.
unique_ptr<int>up(new int(88 );
unique_ptr<int>uPtr2 = std:move(up) ; 
//这里是显式的所有权转移. 把up所指的内存转给uPtr2了,而up不再拥有该内存.另外注意如果你使用vs2008是没有std:move这函数的.
//vs2010开始才有,是c++ 11标准出现的内容。
   *区别:
我们知道scoped_ptr不可做为容器元素.而unique_ptr也同样不能直接做为容器元素,但可以通过一点间接的手段
例如:
unique_ptr<int> sp(new int(88) );
vector<unique_ptr<int> > vec;
vec.push_back(std::move(sp));
//vec.push_back( sp ); 这样不行,会报错的.

所以这样不带引用计数的尽量不要和容器沾边。
它在scope_ptr上加入了std:move()功能,其他跟scope_ptr类似。






*****带引用计数:
*******************shared_ptr
底层维护了一个引用计数,当引用计数为0的时候,我们才真正的析构这块对象
*******************weak_ptr
**为了解决shared指针的交叉引用问题。
weak指针不增加shared的引用计数,但是weak的lock可以返回指weak空间的lock,如果这个空间被释放了
则会返回NULL。
强指针可以给弱指针赋值
**shared_ptr在多个线程同时拿到share_ptr时候,读操作安全写操作不安全,尽量不要在多线程中,需要写
操作使用share_ptr.

猜你喜欢

转载自blog.csdn.net/qq_41784469/article/details/80762691
今日推荐