智能指针unique_ptr

unique_ptr的一些操作:

int main()
{
    unique_ptr<int> uptr(new int(10));
    //unique_ptr<int> uptr2(uptr);//报错
    //unique_ptr<int> uptr3 = uptr;//报错

    unique_ptr<int> uptr2 = std::move(uptr);//转移所有权
    //cout << *uptr << endl;//错误,uptr si NULL

    return 0;
}

 

unique_ptr使用场景:

  1.为动态申请的资源提供异常安全保证

传统情况,可能会因为异常而没有走到delete部分,如下:

void func()
{
    int *p = new int(10);

    //maybe throw exception

    if (NULL != p)
    {
        delete p;
        p = NULL;
    }
}

使用unique_ptr,只要unique_ptr指针创建成功,析构函数就一定会被调用,如下:

void func()
{
    unique_ptr<int> uptr(new int(10));

    //maybe throw exception

    
}

  2.返回函数内动态申请资源的所有权

unique_ptr<int> func(int value)
{
    unique_ptr<int> uptr(new int(value));
    return uptr;
}

int main()
{
    unique_ptr<int> uptr2 = func(10);
    cout << *uptr2 << endl;

    return 0;
}

  3.在容器内保存指针

int main()
{
    vector<unique_ptr<int>> vec;
    unique_ptr<int> uptr(new int(10));
    vec.push_back(std::move(uptr));

    return 0;
}

  4.管理动态数组

int main()
{
    unique_ptr<int[]> uptr(new int[5]{1, 2, 3, 4, 5});
    uptr[0] = 100;
    cout << uptr[0] << endl;

    return 0;
}

 

posted @ 2018-08-31 16:36  c&z  阅读(313)  评论(0编辑  收藏  举报