C++11 智能指针——unique_ptr

//疑问:既然可以将unique_ptr<int>类型push到vector中,那该如何获取unique_ptr<int[]>的每个元素,
//然后分别push到vector中呢?有知道方法的 朋友忘不吝指教,谢谢。2016-03-05***
//2016-03-07 unique_ptr<int[]> uia;uia实际上是数组指针,而且uia[i]的返回是int类型的,除非使用new或malloc重新分配内存然后再使用uia[i]来初始化,否则没有办法将unique_ptr<int[]>所有的元素放到vector<unique_ptr<int> >中。而且push的时候需要使用move,而不能直接使用unique_ptr<int>对象。
  1. unique_ptr是C++11从boost中引进取代auto_ptr的智能指针。
  2. unique_ptr的原始指针对象被一个unique_ptr所独占,不可共享。
  3. unique_ptr不仅适用于new创建的单个对象,也适用于new[]创建的数组对象。
  4. unique_ptr不允许拷贝构造以及拷贝赋值(使用了 = delete显示的删除其拷贝构造与拷贝赋值函数),但可以使用reset来重置管理的原始指针。
  5. unique_ptr可以使用右值引用来返回一个unique_ptr或者使用std::move来转移一个unique_ptr的拥有权到另外一个unique_ptr。
  6. unique_ptr可以自定义删除器,可以在unique_ptr对象析构的时候调用指定的函数/仿函数(删除器具体使用见后续shared_ptr)
  7. unique_ptr适用于STL容器——虽然unique_ptr的拷贝构造与拷贝赋值函数被显示的delete了,但是unique_ptr支持move语意

unique_ptr的简单使用

#include <iostream>
#include <memory>
#include <algorithm>

using namespace std;

int main()
{
    /**< unique_ptr manager new >*/
    unique_ptr<int> ui(new int(5));
    unique_ptr<int> umi = make_unique<int>(5);
    unique_ptr<int> ui2 = ui;                  //WRONG: operator = has been delete from class unique_ptr
    unique_ptr<int> ui3 = move(ui);            //OK,use std::move to transfer ownership,ui release it's ownership and transfer it to ui3

    /**< unique_ptr manager new[] */
    unique_ptr<int[]> uiarray(new int[10]);

    for(int i = 0;i < 10;)
    {
    //operator[](const int __i){return get()[__i];}
    //若原始指针是m_Mng,则unique_ptr<int[]>的[]操作实际上等效于*(m_Mng+i)
        uiarray[i] = i++;
    }

    for(int i = 0;i < 10;++i)
    {
        cout << "u[" << i << "] = " << uiarray[i] << "    ";
    }

    /**< unique_ptr use in vector  */
    vector<unique_ptr<int> > vui;
    vui.push_back(ui);                      //错误:使用已经删除了的unique_ptr
    //error: use of deleted function 'std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = int; _Dp 
    //std::default_delete<int>; std::unique_ptr<_Tp, _Dp> = std::unique_ptr<int>]'
    vui.push_back(move(ui3));                //OK,transfer ownership,set nullptr to ui3
//    for(int i = 0;i < 10;++i)
//    {
//        unique_ptr<int> uimv = move(uiarray[i]);//既然可以将unique_ptr<int>类型push到vector中,那该如何获取unique_ptr<int[]>的每个元素,然后分别push到vector中呢?
//        vui.push_back(uimv);
//    }

     /**< ~unique_ptr() will delete source you new/new[] before */
    return 0;
}


看过一些博客说unique_ptr不适用于数组,看了unique_ptr.h发现有对数组的支持,下面是一个unique_ptr数组使用的例子,运行结束时有将数组的所有元素都析构掉。

//Add 2016-03-07
#include <memory>
#include <iostream>

using namespace std;


class uniclass {
private:
    int m_i;
public:
    uniclass():m_i(0){}
    void operator = (const int i) { m_i = i; }
    ~uniclass() {
        cout << "destroty:" << m_i << endl;
    }
};



void test() {
    unique_ptr<uniclass[]> uia(new uniclass[10]);
    for (int i = 0; i < 10; ++i) {
        uia[i] = i + 1;
    }
}


int main()
{
    test();
    while (1);
    return 0;
}

test()函数运行结束时unique_ptr管理的数组都析构掉了

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值