C++ unique_ptr

原创 2016年08月29日 21:12:21
        std::unique_ptr属于STL库,它的作用和auto_ptr相似,也是管理一个对象指针,提供一个释放内存的封装操作。
        顾名思义,std::unique_ptr独有对象指针的管理权,不会允许其他unique_ptr再来分享了,这是和std::auto_ptr最大的区别了,也是比auto_ptr优越的地方了。
        std::auto_ptr有两个成员变量(Template parameters):
        1.管理对象的指针。
        2.内存回收对象(callable object used as deleter)。默认为default_delete。

        std::uniqur_ptr的构造函数有多个:
default (1)
constexpr unique_ptr() noexcept;
from null pointer (2)
constexpr unique_ptr (nullptr_t) noexcept : unique_ptr() {}
from pointer (3)
explicit unique_ptr (pointer p) noexcept;
from pointer + lvalue deleter (4)
unique_ptr (pointer p,
    typename conditional<is_reference<D>::value,D,const D&> del) noexcept;
from pointer + rvalue deleter (5)
unique_ptr (pointer p,
    typename remove_reference<D>::type&& del) noexcept;
move (6)
unique_ptr (unique_ptr&& x) noexcept;
move-cast (7)
template <class U, class E>
  unique_ptr (unique_ptr<U,E>&& x) noexcept;
move from auto_ptr (8)
template <class U>
  unique_ptr (auto_ptr<U>&& x) noexcept;
copy (deleted!) (9)
unique_ptr (const unique_ptr&) = delete;

        可以指定构造对象,同时支持move构造:

        std::unique_ptr<int> GetVal()
        {
             std::unique_ptr<int> pLocalValue(new int(10));

            return pLocalValue;
        }

        int main()
        {
            std::unique_ptr<int> pMoveConstruct = GetVal();

            return 0;
        }


         但是它不支持拷贝构造,所以就不会出现像std::auto_ptr那么容易的所有权转移问题了。
std::unique_ptr同样会出现同时持有同一对象指针的所有权问题:
         int* pTemp = new int();

         std::unique_ptr<int> p1(pTemp);
         std::unique_ptr<int> p2(pTemp);

所以也要保证"防止两个unique_ptr拥有一个对象"。
        std::unique_ptr不支持拷贝构造,所以不能直接作为容器元素,但是我们可以通过move构造来创建容器元素:
    std::unique_ptr<int> pTemp(new int());
    std::vector < std::unique_ptr<int> > vecTest;
    vecTest.push_back(std::move(pTemp));

        
        同时,std::unique_ptr重载了=操作符:
move assignment (1)
unique_ptr& operator= (unique_ptr&& x) noexcept;
assign null pointer (2)
unique_ptr& operator= (nullptr_t) noexcept;
type-cast assignment (3)
template <class U, class E>
  unique_ptr& operator= (unique_ptr<U,E>&& x) noexcept;
copy assignment (deleted!) (4)
unique_ptr& operator= (const unique_ptr&) = delete;
我们可以看到,同样的只支持move赋值:
        std::unique_ptr<int> pTest1(new int());
        std::unique_ptr<int> pTest2 = std::move(pTest1);

另外还有operator bool操作符,它实现了和指针同样的操作,可以直接当做bool来进行指针的判断:
         std::unique_ptr<int> pTest1(new int());
         if (pTest1) //do sth

        std::unique_ptr和std::auto_ptr的另外一个区别就是可以管理数组,同时也实现了operator[]:
         std::unique_ptr<int[]> pTest1(new int[10]);
         for (int i = 0; i < 10; ++i)
         {
            pTest1[i] = 10;
         }

        我们和std::auto_ptr来对比的话可以发现std::unique_ptr和std::auto_ptr非常的相似,但是unique_ptr不能随随便便的转移所有权,必须通过move来转移,这样对于语意理解有莫大的好处,也不会存在莫名其妙感了。

  2016-10-09:
今天在使用unique_ptr的时候发现一个问题,因为看到有一个release的成员方法,就想当然的认为是释放持有指针的内存,但实际发现析构函数怎么都进不去,重新看文档发现只是释放了所有权并且返回所持有对象的指针。

实战c++中的vector系列--vector<unique_ptr<>>作为函数的参数

现在就讨论一下,把vector作为函数的参数进行传递。 也是直接上一段代码:#include #include #include using namespace std; void display...
  • wangshubo1989
  • wangshubo1989
  • 2015年12月17日 21:20
  • 3002

C++11智能指针之unique_ptr

C++11智能指针之unique_ptr 2013-10-01 21:08 66人阅读 评论(0) 收藏 举报 c++11unique_ptr智能指针RAII 目录(?)...
  • pi9nc
  • pi9nc
  • 2013年10月02日 00:22
  • 30454

C++11 智能指针——unique_ptr

unique_ptr是C++11从boost中引进取代auto_ptr的智能指针,原始指针对象被一个unique_ptr所独占,不可共享。不仅适用于new创建的单个对象,也适用于new[]创建的数组对...
  • wssjlrw
  • wssjlrw
  • 2016年03月05日 21:39
  • 1086

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

我们知道auto_ptr通过复制构造或者通过=赋值后,原来的auto_ptr对象就报废了.所有权转移到新的对象中去了.而通过shared_ptr可以让多个智能指针对象同时拥有某一块内存的访问权.但假如...
  • weiwenhp
  • weiwenhp
  • 2013年03月22日 22:30
  • 47122

Effective Modern C++ 条款18 用std::unique_ptr管理独占所有权的资源

Effective Modern C++ 条款18
  • big_yellow_duck
  • big_yellow_duck
  • 2016年08月25日 21:52
  • 816

C++11中使用shared_ptr和unique_ptr管理动态数组

在C++11中,若使用shared_ptr管理一个动态数组,则需手动制定一个删除器。 auto sp = std::shared_ptr(new int[len], [](char *p){delet...
  • wks19891215
  • wks19891215
  • 2016年03月27日 16:13
  • 4738

C++11教程1 智能指针——unique_ptr

to do
  • u013378438
  • u013378438
  • 2014年06月19日 00:10
  • 2389

STL中的智能指针(Smart Pointer)及其源码剖析: std::unique_ptr

STL中的智能指针(Smart Pointer)及其源码剖析: std::unique_ptr 和 std::auto_ptr一样,std::unique_ptr也是一种智能指针,它也是通过指针的方...
  • yanglingwell
  • yanglingwell
  • 2017年02月23日 21:58
  • 10730

unique_ptr的使用和陷阱

unique_ptr的使用 分配内存 与shared_ptr不同,unique_ptr没有定义类似make_shared的操作,因此只可以使用new来分配内存,并且由于unique_ptr不可拷...
  • qq_33266987
  • qq_33266987
  • 2017年12月12日 17:42
  • 134

Unique_ptr指针总结

Unique_ptr是独享所有权的智能指针,它提供了一种严格语义上的所有权,包括: 1、           拥有它所指向的对象(同一时间只能有一个只能指针对象指向某个内存)   2、     ...
  • ledaosi
  • ledaosi
  • 2014年09月28日 10:08
  • 1267
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ unique_ptr
举报原因:
原因补充:

(最多只允许输入30个字)