C++11智能指针unique_ptr用法使用场景分析

一、概述

C++ 标准模板库 STL(Standard Template Library) 一共给我们提供了四种智能指针:auto_ptr、unique_ptr、shared_ptr 和 weak_ptr,其中 auto_ptr 是 C++98 提出的,C++11 已将其摒弃,并提出了 unique_ptr 替代 auto_ptr。虽然 auto_ptr 已被摒弃,但在实际项目中仍可使用,但建议使用更加安全的 unique_ptr,后文会详细叙述。shared_ptr 和 weak_ptr 则是 C+11 从准标准库 Boost 中引入的两种智能指针。此外,Boost 库还提出了 boost::scoped_ptr、boost::scoped_array、boost::intrusive_ptr 等智能指针,虽然尚未得到 C++ 标准采纳,但是在开发实践中可以使用。

二、实现原理

  1. unique_ptr 是 C++ 11 提供的用于防止内存泄漏的智能指针中的一种实现,即使在异常发生时也可帮助避免资源泄露。
  2. unique_ptr实现了独享被管理对象指针的概念,这意味这它可确保一个对象和其对应的资源同一时间只被一个pointer拥有。一旦拥有者被销毁或者变成empty或者开始拥有另一个对象,先前拥有的那个对象就会被销毁,其任何相应资源亦会被释放。
  3. unique_ptr具有->和*运算符重载符,因此它可以像普通指针一样使用。

三、使用场景

先看不使用智能指针,写代码时的痛点,有可能忘记delete对象,在某处return的时候,或者在某处抛出异常,导致末尾的delete语句就没机会被调用,导致内存泄漏。在还是只new一个对象,如果new2,3甚至更多对象,那管理起来,代码变的比较复杂,而且累赘。

这是一种不好的编程风格,应该避免,因为它复杂而又容易出错。

#include <memory>
#include<iostream>
using namespace std;

class A {};
int main()
{
	A* ptrA = new A;
	try
	{
		//...
		//...
		//...
		//...
		//...
	}
	catch (...)
	{
		delete ptrA;		//1
		throw;
	}

	delete ptrA;			//2
	return 0;
}

了解了这个痛点,那么本篇的主角unique_ptr就该闪亮登场了。

unique_ptr对象可以在自身被销毁时释放其所指向的数据。并且unique_ptr它所指向的对象只有一个拥有者。

上面糟心的代码就可以用unique_ptr来优化,在也不需要delete和catch子句。

#include <memory>
#include<iostream>
using namespace std;

class A {};
int main()
{
	unique_ptr<A> upA(new A);

	//...
	//...

	return 0;
}

四、unique_ptr的目的

  • 获取某些资源
  • 执行某些操作
  • 将取得的资源释放掉

五、常用操作

unique_ptr<int> up1(new int(1));//ok
unique_ptr<int> up2 = new int(1);//error

构造函数1:可以用原始指针当实参传给构造函数。

但不能使用=赋值符,那样的话会报错,“无法从“int *”转换为“std::shared_ptr”,是不是很熟悉。

这点和share_ptr一致

构造函数2:make_unique函数

unique_ptr<string> up4 = make_unique<string>("hello");//ok

构造函数3

int* p = new int;
unique_ptr<int> up5(p);//ok
unique_ptr<int> up6(p);//logic error,这个是运行期错误,程序员必须避免这样的失误

这样的问题在于sp1,sp2,在丢失p的拥有权时释放相应资源,即会执行两次delete p操作。

不可以对unique_ptr执行copy或者assign操作,只能move,将拥有权移交给另一个unique_ptr

	int* p = new int;
	unique_ptr<int> up5(p);//ok
	unique_ptr<int> up6(up5);//error
	unique_ptr<int> up7(move(up5));//ok
操作 效果
unique_ptr up Default构造函数,建立一个empty unique pointer
unique_ptr up(ptr) 建立unique pointer令其拥有*ptr
unique_ptr up(nullptr) 建立一个empty unique pointer
unique_ptr up(move(up2)) 建立一个unique pointer,拥有up2之前拥有的pointer(up2将为empty)
up.~unique_ptr() 析构函数,调用deleter
up=up2 赋值(sp将共享sp2的拥有权,放弃其先前索拥有对象的所有权)
up=move(up2) move assignment(sp2将拥有权移交给up)
up=nullptr 对一个被拥有物调用delete,i并令为空(等价up.reset())
up1.swap(up2)==swap(up1,up2) 交换up1,up2的pointer
up.reset() 放弃拥有权,并重新初始化,使它=empty
up.reset(ptr) 放弃拥有权,重新初始化(拥有*ptr)
make_unique(…) 为一个新对象(以传入的实参为初值)建立一个unique pointer
up.get() 返回存储的pointer,就是返回原始指针,对该原始指针如果执行delete,会异常。
*up 同上
up-> 为拥有物提供成员访问
if(up) 判断sp是否empty
get_deleter(up) 返回deleter的地址(如果有的话),没有返回nullptr

到此这篇关于C++11智能指针unique_ptr用法介绍的文章就介绍到这了,更多相关C++11 unique_ptr智能指针内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++11智能指针之weak_ptr详解

    如题,我们今天要讲的是 C++11 引入的三种智能指针中的:weak_ptr. 在学习 weak_ptr 之前最好对 shared_ptr 有所了解.如果你还不知道 shared_ptr 是何物,可以看看另一篇文章: [C++11新特性] C++11智能指针之shared_ptr 1.为什么需要weak_ptr? 在正式介绍weak_ptr之前,我们先来回忆一下shared_ptr的一些知识. 我们知道shared_ptr是采用引用计数的智能指针,多个shared_ptr实例可以指向同一个动态对

  • C++11 智能指针的具体使用

    目录 智能指针的原理 RAII 智能指针的原理 auto_ptr 1.auto_ptr的使用及问题 unique_ptr shared_ptr shared_ptr的循环引用 智能指针的原理 RAII RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内存.文件句柄.网络连接.互斥量等等)的简单技术. 在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源. 借此,我

  • C++11新特性之智能指针(shared_ptr/unique_ptr/weak_ptr)

    shared_ptr基本用法 shared_ptr采用引用计数的方式管理所指向的对象.当有一个新的shared_ptr指向同一个对象时(复制shared_ptr等),引用计数加1.当shared_ptr离开作用域时,引用计数减1.当引用计数为0时,释放所管理的内存. 这样做的好处在于解放了程序员手动释放内存的压力.之前,为了处理程序中的异常情况,往往需要将指针手动封装到类中,通过析构函数来释放动态分配的内存:现在这一过程就可以交给shared_ptr去做了. 一般我们使用make_shared来

  • C++11智能指针中的 unique_ptr实例详解

    在前面一篇文章中,我们了解了 C++11 中引入的智能指针之一 shared_ptr 和 weak_ptr ,今天,我们来介绍一下另一种智能指针 unique_ptr . 往期文章参考: [C++11新特性] C++11 智能指针之shared_ptr [C++11新特性] C++11智能指针之weak_ptr unique_ptr介绍 unique是独特的.唯一的意思,故名思议,unique_ptr可以"独占"地拥有它所指向的对象,它提供一种严格意义上的所有权. 这一点和我们前面介绍

  • C++11 智能指针之shared_ptr代码详解

    C++中的智能指针首先出现在"准"标准库boost中. 随着使用的人越来越多,为了让开发人员更方便.更安全的使用动态内存,C++11也引入了智能指针来管理动态对象. 在新标准中,主要提供了shared_ptr.unique_ptr.weak_ptr三种不同类型的智能指针. 接下来的几篇文章,我们就来总结一下这些智能指针的使用. 今天,我们先来看看shared_ptr智能指针. shared_ptr 智能指针 shared_ptr是一个引用计数智能指针,用于共享对象的所有权也就是说它允许

  • c++11 新特性——智能指针使用详解

    c++11添加了新的智能指针,unique_ptr.shared_ptr和weak_ptr,同时也将auto_ptr置为废弃(deprecated). 但是在实际的使用过程中,很多人都会有这样的问题: 不知道三种智能指针的具体使用场景 无脑只使用shared_ptr 认为应该禁用raw pointer(裸指针,即Widget*这种形式),全部使用智能指针 初始化方法 class A { public: A(int size){ this->size = size; } A(){} void Sh

  • c++11&14-智能指针要点汇总

    学c++的人都知道,在c++里面有一个痛点,就是动态内存的管理,就我所经历的一些问题来看,很多莫名其妙的问题,最后都发现是内存管理不当引起的. 但像java等其他一些语言则不会有这样的问题,为什么呢,因为它们有很好的处理内存的方法,比如java的垃圾回收机制,现在,我们c++终于也有了智能指针. 1. 什么是智能指针 简单地说,智能指针是用对象去管理一个资源指针,同时用一个计数器计算引用当前指针对象的个数,当管理指针的对象增加或减少时,计数器也相应加1或减1,当最后一个指针管理对象销毁时,计数器

  • C++11智能指针unique_ptr用法使用场景分析

    一.概述 C++ 标准模板库 STL(Standard Template Library) 一共给我们提供了四种智能指针:auto_ptr.unique_ptr.shared_ptr 和 weak_ptr,其中 auto_ptr 是 C++98 提出的,C++11 已将其摒弃,并提出了 unique_ptr 替代 auto_ptr.虽然 auto_ptr 已被摒弃,但在实际项目中仍可使用,但建议使用更加安全的 unique_ptr,后文会详细叙述.shared_ptr 和 weak_ptr 则是

  • C++ STL 四种智能指针的用法详解

    0.前言 C++ 标准模板库 STL(Standard Template Library) 一共给我们提供了四种智能指针:auto_ptr.unique_ptr.shared_ptr 和 weak_ptr,其中 auto_ptr 是 C++98 提出的,C++11 已将其摒弃,并提出了 unique_ptr 替代 auto_ptr.虽然 auto_ptr 已被摒弃,但在实际项目中仍可使用,但建议使用更加安全的 unique_ptr,后文会详细叙述.shared_ptr 和 weak_ptr 则是

  • 一文掌握C++ 智能指针全部用法

    目录 一.为什么要使用智能指针 二.auto_ptr 三.unique_ptr 四.shared_ptr 五.weak_ptr 六.智能指针的使用陷阱 七.总结 为什么要学习智能指针? 咳咳,这个问题不是问大家的,是询问我自己的! 我依稀记得刚离校出来找实习工作那会,去面试一份工作,其中有一个环节需要答题:有一道题目就是问什么是智能指针?卧槽?当时我就懵逼,智能指针我压根就没有听说过- 最后,面试的这份工作理所应当的黄了. 差不多是一年前左右吧,现在趁有闲余时间,学习一下智能指针,丰富一下自己!

  • C++中auto_ptr智能指针的用法详解

    智能指针(auto_ptr) 这个名字听起来很酷是不是?其实auto_ptr 只是C++标准库提供的一个类模板,它与传统的new/delete控制内存相比有一定优势,但也有其局限.本文总结的8个问题足以涵盖auto_ptr的大部分内容. auto_ptr是什么? auto_ptr 是C++标准库提供的类模板,auto_ptr对象通过初始化指向由new创建的动态内存,它是这块内存的拥有者,一块内存不能同时被分给两个拥有者.当auto_ptr对象生命周期结束时,其析构函数会将auto_ptr对象拥有

  • c++智能指针unique_ptr的使用

    目录 1.为什么需要unique_ptr 2.什么是unique_ptr 3.unique_ptr特性 4.如何使用unique_ptr 4.1简单使用 4.2指向数组 5.unique_ptr需要注意什么 1.为什么需要unique_ptr 与shared_ptr作用类似,需要解决内存泄漏的问题,但是却不需要使用shared_ptr的引用计数,所以为了减少消耗,就需要一个这样的智能指针.但是使用已被废弃的auto_ptr的话就会有新的问题,auto_ptr在使用过程中如果被拷贝构造或者赋值的话

随机推荐