Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1875952
  • 博文数量: 184
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2388
  • 用 户 组: 普通用户
  • 注册时间: 2016-12-21 22:26
个人简介

90后空巢老码农

文章分类

全部博文(184)

文章存档

2021年(26)

2020年(56)

2019年(54)

2018年(47)

2017年(1)

我的朋友

分类: C/C++

2021-02-09 09:33:23

对智能指针简单说就是:  它有可能如此的智能以至于能够“知道”它自己是不是“指向某物”的最后一个指针,并运用这样的知识,在它的确是该对象的最后一个拥有者而且它被删除时,销毁它所指向的对象。自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实现独占式拥有或严格拥有概念,保证同一时间内只有一个智能指针可以指向该对象。可以移交使用权。它对于避免资源泄露特别有用

所有智能指针类都定义在头文件内
阅读(1657) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~