C++11智能指针
来源:互联网 发布:方舟史上最强优化 编辑:程序博客网 时间:2024/06/05 16:03
c++11智能指针
本文介绍c++的四种智能指针,其中后三种是c++11新增加的,auto _ptr已被弃用。
要编译c++11,需要安装g++-4.8
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get instal gcc-4.8
sudo apt-get install g++-4.8
编译时指定标准:
g++-4.8 -std=c++11
auto_ptr详细请参考这里
auto_ptr是为了推动RAII而加入到c++标准的第一个智能指针,它实现了最基本的资源管理,不过与其他类型不同的是,auto_ptr是没有复制语义的,它在复制时实现的其实是移动语义,复制和赋值auto_ptr时会默认改变所管理资源的所有权,基于这个原因,它也不能在stl容器中使用,因为容器内的元素必需支持可复制和可赋值。另外还有一个限制它使用范围的因素是它的析构函数默认调用delete,而且无法重载,所以不能支持数组等对象。
class A{public: A(int i) :ival(i){ printf("create %d \n",ival); } ~A(){ printf("delete %d \n", ival); } int getvalue(){ return ival;}private: int ival;};auto_ptr<A> ptr1(new A(1));auto_ptr<A> ptr2(new A(2));assert(ptr1->getvalue()==1);assert(ptr2->getvalue()==2);ptr1 = ptr2;assert(ptr2.get ()==NULL); // now ptr2 is NULL
unique_ptr详细请参考这里
由于auto_ptr存在各种问题,c++11中unique_ptr华丽登场替换了auto_ptr,它们所做的事情基本一样,不过unique_ptr不支持复制语义,只支持移动语义,所以无法执行普通的复制或赋值操作(返回将要被销毁的unique_ptr时例外),但是可以进行移动构造赋值操作,说白了就是复制的话需要显示move。另外unique_ptr可以重载删除器,使其支持数组等类型。
unique_ptr<A> ptr1(new A(1));unique_ptr<A> ptr2(new A(2));ptr1 = ptr2; //errorptr1 = move(ptr2); //right, ptr2 is NULLassert(ptr2==NULL)unique_ptr<A[]> ptr3(new A[2]{3,4}); //arrayassert(ptr3[0].getvalue()==3);assert(ptr3[1].getvalue()==4);
shared_ptr 详细请参考这里
通常概念下的智能指针指的是shared_ptr,它允许共享资源,使用引用计数记录资源被几个指针共享。调用release(),析构函数或者被复制赋值时,原来管理的资源的引用计数都会减1,计数为0时释放资源。
shared_ptr<A> ptr1(new A(1));shared_ptr<A> ptr2(new A(2));assert(ptr1->getvalue()==1);assert(ptr1.use_count()==1);assert(ptr2->getvalue()==2);assert( ptr2.use_count())==1);ptr1 = ptr2;assert(ptr1.use_count()==2)assert(ptr2.use_count()==2)assert(ptr1->getvalue()==2);assert(ptr2->getvalue()==2);
weak_ptr详细请参考这里
使用shared相互引用时会出现资源无法释放的情况,比如:
class B;class A{public: shared_ptr<B> pb_value; ~A() { cout<<"A delete\n"; } };class B{public: shared_ptr<A> pa_value; ~B() { cout<<"B delete\n"; } };shared_ptr<B> pb(new B());shared_ptr<A> pa(new A());pb->pa_value = pa;pa->pb_value = pb;assert(pa.use_count()==2)assert(pb.use_count()==2)
引用如下
当pa,pb析构后,引用计数都等于1,资源不会释放。解决方法是将pa_value和pb_value中任意一个声明为 weak_ptr类型。
week_ptr是对对象的一种弱引用,它不会增加对象的引用计数。week_ptr和shared_ptr之间可以相互转换,shared_ptr可以直接赋值给week_ptr,week_ptr可通过调用lock函数来获得shared_ptr(如果对象已经被释放,则返回一个空的shared_ptr)。
weak_ptr<A> pa_value;
修改后pb->pa_value=pa 不会增加pa的计数,pa计数为1,离开作用域后计数为0,pa正常释放,于是pb计数也会减为0,正常释放。
- c++:智能指针
- C++:智能指针
- 【C++】智能指针
- 【C++】智能指针
- C++PJ智能指针
- 【c++】智能指针
- 【C++】智能指针auto_ptr
- C++,智能指针
- C++,boost智能指针
- 智能指针模拟C
- [C++]智能指针
- 【C++】 浅析智能指针
- C++_智能指针
- C++:初识智能指针
- C++::智能指针
- 【C++】智能指针
- c智能指针:unique_ptr
- 【C++】智能指针
- 收到了TexturePack的使用许可
- Sqlyog字段的各属性的意思
- Session &Cookie
- 品味细节之java方法重载调用细节
- 递归案例
- C++11智能指针
- C# WPF 项目中无法使用Console输出时出现句柄无效的IO异常解决方法
- NYOJ a problem is easy
- Android实现左右滑动指引效果
- JQuery中阻止事件冒泡方式及其区别
- 将引用做为传递参数
- linux socket中关闭连接
- java 泛型详解
- 如何从 Visual Basic 的另一个用户身份启动进程