智能指针之unique_ptr

概述

与shared_ptr不同,某个时刻只能有一个unique_ptr指向一个给定对象。当unique_ptr被销毁时,它所指向的对象也被销毁。同时,unique_ptr也没有类似于make_shared的标准库函数,当我们定义一个unique_ptr时,需要将其绑定到一个new返回的指针。因此初始化unique_ptr需要使用直接初始化的形式。例如:

    unique_ptr<double> p(new double(3.14));    // p指向一个值为3.14的double

并且,由于一个unique_ptr“拥有”(唯一指向)其指向的对象,所以unique_ptr不支持拷贝或者赋值操作:

    unique_ptr<string> p1(new string("southernEast"));
    unique_ptr<string> p2(p1);    // 错误:不能拷贝
    unique_ptr<string> p3;
    p3 = p2;                      // 错误:不能赋值

虽然我们不能拷贝或者赋值一个unique_ptr,但是我们能够通过使用release或reset函数来将一个非const的unique_ptr的指针所有权转移给另一个unique_ptr。例如:

    unique_ptr<string> p2(p1.realease());  // 将p1的指针所有权转移给p2,release将p1置空
    unique_ptr<string> p3(new string("southernEast"));
    p2.reset(p3.release());                // reset释放了p2原来指向的内存,并将p3指针的所有权转移给p2

这里需要注意的是,reset函数会释放其原来指向的对象,而release函数仅仅只是返回当前保存的指针,并将当前保存的指针值置为空,不会释放其原来指向的对象(形象地说就是“放弃控制权”)。

常用操作 用法说明
unique_ptr< T > u 空的指向类型为T的对象的unique_ptr
unique_ptr< T, D > u 使用一个类型为D的可调用对象释放它的指针
unique_ptr< T, D > u(d) 使用类型为D的对象d来代替delete
u = nullptr 释放u指向的对象,将u置为空
u.release() 放弃对指针的控制权,返回指针,并将u置为空
u.reset() 释放u指向的对象
u.reset(q) 将u指向内置指针q
u.reset(nullptr) 将u置为空

传递unique_ptr参数和返回unique_ptr

不能拷贝unique_ptr的规则有一个例外:我们可以拷贝或赋值一个将要被销毁的unique_ptr,例如从函数返回的uinque_ptr:

unique_ptr<int> clone1(int p) {
    return unique_ptr<int>(new int(p));    // 正确
}
unique_ptr<int> clone2(int p) {
    unique_ptr<int> ret(new int(p));       // 正确
    return ret;
}

在以上两种情况下,编译器能够知道要返回的对象将要被销毁,因此编译器会对其进行一种特殊的“拷贝”。

向unique_ptr传递删除器

重载一个unique_ptr中的删除器会影响到unique_ptr类型以及如何构造该对象,我们需要在尖括号中unique_ptr指向类型之后提供一个删除器类型。在创建或reset一个这种unique_ptr类型时,必须提供一个指定类型的可调用对象来作为删除器。形式如下:

    // p指向一个objT的对象,并使用一个类型为delT的对象释放objT对象
    // 它会使用一个名为fcn的delT对象作为删除器
    unique_ptr<objT, delT> p (new objT, fcn);

原文地址:https://www.cnblogs.com/southernEast/p/12538557.html

时间: 2024-10-10 03:36:13

智能指针之unique_ptr的相关文章

C++ Primer 学习笔记_56_STL剖析(十一)(原boost库):详解智能指针(unique_ptr(原scoped_ptr) 、shared_ptr 、weak_ptr源码分析)

注意:现在boot库已经归入STL库,用法基本上还和boost类似 在C++11中,引入了智能指针.主要有:unique_ptr, shared_ptr, weak_ptr. 这3种指针组件就是采用了boost里的智能指针方案.很多有用过boost智能指针的朋友,很容易地就能发现它们之间的关间: std boost 功能说明 unique_ptr scoped_ptr 独占指针对象,并保证指针所指对象生命周期与其一致 shared_ptr shared_ptr 可共享指针对象,可以赋值给shar

智能指针(三):unique_ptr使用简介

我们知道auto_ptr通过复制构造或者通过=赋值后,原来的auto_ptr对象就报废了.所有权转移到新的对象中去了.而通过shared_ptr可以让多个智能指针对象同时拥有某一块内存的访问权.但假如我们不希望多个内存块被多个智能指针对象共享,同时又不会像auto_ptr那样不知不觉的就让原来的auto_ptr对象失效,可咋整呢? 这个时候就要使用unique_ptr了,顾名思义嘛,unique是唯一的意思.说明它跟auto_ptr有点类似,就是同时只能有一个智能指针对象指向某块内存.但它还有些

智能指针之 unique_ptr

对于动态申请的内存,C++语言为我们提供了new和delete运算符, 而没有像java一样,提供一个完整的GC机制,因此对于我们申请的动态内存,我们需要时刻记得释放,且不能重复释放,释放后不能再去使用...  因此在使用时造成很多不便,且容易出现很多问题,一旦出问题就造成core dump,程序直接挂掉 , 这个时候,智能指针的优势就体现出来了,智能指针符合RAII原则,资源获取就是初始化,在对象析构时,将资源进行释放,对动态内存做到一个比较好的管理 unique_ptr 持有对对象的独有权-

智能指针(shared_ptr,unique_ptr)作为函数参数或者返回值时的一些注意事项

当智能指针作为函数的参数或者返回值时,一直在纠结到底是用智能指针对象本身还是用原始指针.Herb Sutter大师的文章很好的解决了这个疑惑,参见网址: https://herbsutter.com/2013/06/05/gotw-91-solution-smart-pointer-parameters/ 总结起来如下 1. 不要传递shared_ptr本身,而是用原始指针.因为会有性能损失,原子操作的自增自减等. 使用f(widget *w) 不使用f(shared_ptr< widget >

C++11智能指针:unique_ptr

unique_ptr 1.概念 unique_ptr形如其名,与所指对象的内存紧密地绑定,不能与其他的unique_ptr类型的指针对象共享所指向对象的内存. 在cplusplus.com中,unique_ptr声明如下: // non-specialized template <class T, class D = default_delete<T>> class unique_ptr; // array specialization template <class T,

智能指针简介

智能指针用于解决常规指针所带来的内存泄露.重复释放.野指针等内存问题.智能指针基于这样的事实得以发挥作用:定义在栈中的智能指针,当超出其作用域时,会自动调用它的析构函数,从而可以释放其关联的内存资源. 之前C++标准库中定义的智能指针std::auto_ptr<T>,因其设计存在缺陷,所以已不再推荐使用.C++11引入了新的智能指针:unique_ptr.shared_ptr和weak_ptr. 一:unique_ptr unique_ptr类似于auto_ptr.两个unique_ptr实例

C++智能指针类模板

1.智能指针本质上是一个对象,这个对象可以像原生的一样来进行使用.原因是智能指针对象对应的类中,将指针相关的操作都进行了重载操作处理,所以才会达到这种像是原生的效果. 2.智能指针的意义: 现在C++开发库中最重要的类模板之一 C++中自动内存管理的主要手段 能够在很大程度上避开内存相关的问题 3.在QT中开发库中也提供了智能指针类模板,在STL标准库中也提供了,在c++的标准库忘了什么名了中也提供了智能指针类模板.所以智能指针类模板在C++中的地位很重要 4.STL中的智能指针类模板 auto

使用智能指针来管理对象 (基于RAII)

////一个简单的防止内存泄露的例子//void test() { //使用RAII的特性管理资源 //当智能指针unique_ptr被销毁时,它指向的对象也将被销毁 //这里test函数返回后 p将自动销毁 //unique_ptr<int[]> p( new int[200] ); //直接生成资源 //test函数返回后 p不能被正常销毁,就会造成资源泄露 //int* p = new int[200]; } int main() { while( 1 ) { test(); Sleep

c++11 智能指针

如果在程序中使用new从堆(自由存储区)分配内存,等到不需要时, 应使用delete将其释放.c++引入了智能指针auto_ptr, 以帮助自动完成这个过程. c++11摒弃了auto_ptr,并新增了三种智能指针:unique_ptr, shared_ptr, weak_ptr. 一. auto_ptr, unique_ptr , shared_ptr 头文件:  #include <memory> 用法:  auto_ptr<double>  A(new double); un