c++11的碎碎念之智能指针

1600阅读 0评论2021-02-09 stolennnxb
分类:C/C++

对智能指针简单说就是:  它有可能如此的智能以至于能够“知道”它自己是不是“指向某物”的最后一个指针,并运用这样的知识,在它的确是该对象的最后一个拥有者而且它被删除时,销毁它所指向的对象。自c++11起,C++标准库提供两大类型的smart pointer:
1. Class shared_ptr实现共享式拥有概念,多个智能指针可以指向相同的对象,该对象和其相关资源会在“最后一个引用被销毁”时被释放。标准库还提供了weak_ptr、bad_weak_ptr和enable_shared_from_this等辅助类。
shared_ptr在真正释放资源的时候会调用在创建它是指定的deleter,如果没有指定,会调用默认的,而且它本身不会像unique_ptr一样的,可以接受数组类型模板参数,这就导致了shared_ptr想要管理数组的时候,需要额外指定,代码如下所示:

点击(此处)折叠或打开

  1. shared_ptr<int> p(new int[10]);// 编译ok,但是释放时有问题
  2. shared_ptr<int> p(new int[10],[](int* p){delete[] p;});
  3. shared_ptr<int> q(new int[10],std::default_delete<int []>());
  4. unique_ptr<int []> r(new int[10]);
  5. shared_ptr<int []> s(new int[10]); // 编译会报错
另外,shared_ptr只提供operator*和operator->,如果想访问内存,必须使用shared_ptr包覆的内部指针,提供完全的指针语义,如:smp.get()[i] 语义上等同于:(&*smp)[i]
Class wea_ptr: 
为避免shared_ptr循环引用等问题,这里引入了weak_ptr, 它的值来自于shared_ptr但是不增加其引用计数,不支持解引用操作,可以通过lock来升级出一个新的shared_ptr


2. Class unique_ptr实现独占式拥有或严格拥有概念,保证同一时间内只有一个智能指针可以指向该对象。可以移交使用权。它对于避免资源泄露特别有用

所有智能指针类都定义在头文件内
上一篇:c++11的碎碎念之新添加概念
下一篇:c++11的碎碎念之两点小坑——remove和array的swap