您当前的位置: 首页 > 

顺其自然~

暂无认证

  • 0浏览

    0关注

    1317博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

智能指针 unique_ptr 详解

顺其自然~ 发布时间:2021-02-22 09:02:36 ,浏览量:0

一、智能指针 1.什么是智能指针

简单地说,C++智能指针是包含重载运算符的类,其行为像常规指针,但智能指针能够及时、妥善地销毁动态分配的数据,并实现了明确的对象生命周期,因此更有价值。

2.常规指针存在的问题

C++在内存分配、释放和管理方面向程序员提供了全面的灵活性。但是这种灵活性是把双刃剑,一方面它使C++成为一种功能强大的语言,另一方面它让程序员能够制造与内存相关的问题,比如内存泄漏(用完未释放,遗漏掉了)。

例如在堆声明和分配的内存,析构方法是否会自动销毁对象,又或是方法结束后需要一个个释放,方法存在很多返回的地方,每个返回语句都要执行很多相关释放操作,十分繁琐,用智能指针就能实现其自动释放。

3.智能指针有何帮助

鉴于使用常规指针存在的问题,当C++程序猿需要管理堆中的数据时,可使用智能指针的方式分配和管理内存。

4.智能指针

智能指针类重载了解除引用运算符(*)和成员选择运算符(->)。

同时为了能够在堆中管理各种类型,几乎所有的智能指针都是模板类,包含其功能的泛型实现。

二、unique_ptr 简介 1.概念

unique_ptr 是从 C++ 11 开始,定义在 中的智能指针(smart pointer)。它持有对对象的独有权,即两个 unique_ptr 不能指向一个对象,不能进行复制操作只能进行移动操作。

unique_ptr 之所以叫这个名字,是因为它只能指向一个对象,即当它指向其他对象时,之前所指向的对象会被摧毁。其次,当 unique_ptr 超出作用域时,指向的对象也会被自动摧毁,帮助程序员实现了自动释放的功能。

unique_ptr 也可能还未指向对象,这时的状态被称为 empty。

2.简单示例
std::unique_ptrp1(new int(5));
std::unique_ptrp2=p1;// 编译会出错
std::unique_ptrp3=std::move(p1);// 转移所有权, 现在那块内存归p3所有, p1成为无效的针.
p3.reset();//释放内存.
p1.reset();//无效
三、unique_ptr 详解 1.定义

unique_ptr 在 中的定义如下:

// non-specialized 
template  class unique_ptr;
// array specialization   
template  class unique_ptr;

其中 T 指其管理的对象类型,D 指该对象销毁时所调用的释放方法,可以使用自定义的删除器,他也有一个默认的实现,即 detele 操作。

2.常用方法介绍

2.1 构造方法 std::unique_ptr::unique_ptr

// unique_ptr constructor example
#include 
#include 
 
int main () {
  std::default_delete d;
  std::unique_ptr u1;
  std::unique_ptr u2 (nullptr);
  std::unique_ptr u3 (new int);
  std::unique_ptr u4 (new int, d);
  std::unique_ptr u5 (new int, std::default_delete());
  std::unique_ptr u6 (std::move(u5));
  std::unique_ptr u7 (std::move(u6));
  std::unique_ptr u8 (std::auto_ptr(new int));
 
  std::cout             
关注
打赏
1662339380
查看更多评论
0.0503s