std::unique_ptr 指针

管理指针的存储,提供有限的垃圾收集功能,对内置指针的开销很少甚至没有(取决于使用的删除程序).

这些对象具有取得指针所有权的能力:一旦它们取得所有权,它们就通过在某个点上负责删除指针来管理该指针对象.

unique_ptr对象在其尽快销毁自身和被他管理的对象(通过deleter),在他们的值改变或者在通过unique_ptr::reset函数明确赋值时。

unique_ptr对象唯一拥有其指针:任何其他设施都不应删除该对象,因此其他指针也不应指向其托管对象,因为unique_ptr对象一有必要就删除其托管对象,而不考虑其他指针是否仍指向同一对象,从而留下任何其他指向那里的指针作为指向无效位置的指针。

一个unique_ptr 有两部分:

存储的指针:指向它管理的对象(指针)。这是在构造时设置的,可以通过赋值操作或调用成员reset进行更改,也可以使用成员函数get或release单独访问以进行读取。

存储的deleter:一个可调用的对象,它接受与存储指针相同类型的参数,并被调用以删除托管对象。它是在构造时设置的,可以通过赋值操作进行更改,并且可以使用成员get_deleter单独访问。

unique_ptr对象通过运算符*和->(对于单个对象)或运算符[(对于数组对象)提供对其托管对象的访问,从而复制有限的指针功能。出于安全原因,它们不支持指针算法,只支持移动分配(禁用复制分配)。

例子:

void process_big_object(std::unique_ptr data)
{
	*data += 10;
	std::cout << "in: " << *data << std::endl;
}


std::unique_ptr p(new int);

int main()
{
int x = 42;
p.reset(&x);
std::thread t(process_big_object, std::move(p));
t.join();
std::cout << x << std::endl;
getchar();
}

process_big_object中会报错;

 

#include 
#include 
using namespace std;

// unique_ptr::get vs unique_ptr::release
int main()
{
    std::unique_ptr foo; //foo - null
    std::unique_ptr bar; //bar - null
    int* p = nullptr;
    foo = std::unique_ptr(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;
}

 

你可能感兴趣的:(C++11并发编程)