管理指针的存储,提供有限的垃圾收集功能,对内置指针的开销很少甚至没有(取决于使用的删除程序).
这些对象具有取得指针所有权的能力:一旦它们取得所有权,它们就通过在某个点上负责删除指针来管理该指针对象.
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<int> data)
{
*data += 10;
std::cout << "in: " << *data << std::endl;
}
std::unique_ptr<int> 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 <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;
}