c++11智能指针std::unique_ptr

智能指针std::unique_ptr
std::unique_ptr
1.特性

1) 任意时刻unique_ptr只能指向某一个对象,指针销毁时,指向的对象也会被删除(通过内置删除器,通过调用析构函数实现删除对象)
2)禁止拷贝和赋值(底层实现拷贝构造函数和复制构造函数 = delete),可以使用std::move()、unique_ptr.reset(…) 转移对象指针控制权。

(由1决定,指针发生了拷贝就违反了第一条)

2.怎么实现禁止拷贝构造和赋值构造?

拷贝构造 和 赋值符‘=’ 对应函数 被删除了,所以用不了。
在这里插入图片描述
可以在IDE/编辑器中查看详细实现:
在这里插入图片描述
我们可以看到,拷贝和赋值函数被禁止实现(禁用)了。

更加详细的内容参阅cppreference:

① std :: unique_ptr 构造

② 赋值

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

// unique_ptr::get vs unique_ptr::release
int main() 
{
    std::unique_ptr<int> foo; //foo - null
    std::unique_ptr<int> bar; //bar - null
    int* p = nullptr;
    foo = std::unique_ptr<int>(new int(100));// foo - 100
    bar = std::move(foo); // foo转移给bar bar - 100 foo - null
    p = bar.get(); // p - 100 smart pointer.get()返回一个指向该对象的内置指针
    foo.reset(bar.release()); // bar 放弃指针控制权,返回指针给foo foo - 100, bar已经不存在

    cout << "foo : " << *foo << endl;
    cout << "p   : " << *p << endl;
    delete p; //记得删除,这也是使用智能指针的初衷之一---防止内存泄漏!!!

    if (bar)
        cout << "bar : " << *bar << endl;
    else
        cout << "bar已经被释放" << endl; //这里bar已经销毁了,可能会报错。

    return 0;
}

转载至:https://www.cnblogs.com/yocichen/p/10561615.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章