std::unique_ptr
是 C++11 标准的 STL 中, 用来取代 std::auto_ptr
的指针容器 (如果在代码中使用了 std::auto_ptr
, 使用 gcc 4.5 之后的版本加上 -std=c++0x -Wall
参数编译时, gcc 会报出警告 std::auto_ptr
已经过时).同
std::auto_ptr
一样, std::unique_ptr
的基本功效也能当作简单的自动对象管理指针来使用, 如#include <memory> /* for std::unique_ptr */
#include <iostream>
struct echo {
echo()
{
std::cout << "ctor" << std::endl;
}
~echo()
{
std::cout << "dtor" << std::endl;
}
echo(echo const&) = delete;
};
void test()
{
std::unique_ptr<echo> echo_ptr(new echo);
}
int main()
{
test();
std::cout << "." << std::endl;
return 0;
}
ctor
dtor
.
echo
在构造和析构时的输出信息可以帮助掌握对象的生命周期. 如上述程序中, echo
对象在 test
函数结束时析构.std::unique_ptr
的复制构造函数被 delete
处理了, 所以类似下面的代码会出错std::unique_ptr<int> a(new int(0));
std::unique_ptr<int> b(a); // ERROR
// deleted function
// ‘std::unique_ptr<...>::unique_ptr(std::unique_ptr<...> const&)'
std::unique_ptr<int> b(new int(*a));
a
所持有的指针转移到 b
中, 需要显式调用 std::move
将来移交指针控制权std::unique_ptr<int> a(new int(0));
std::unique_ptr<int> b(std::move(a));
a
中的指针会变为 NULL
. 明确的转移语义由 std::move
函数表达, 与 std::auto_ptr
暧昧的构造函数不同, std::move
明确指出 std::unique_ptr
对象是通过转移构造进行参数传递的.当函数需要使用
std::unique_ptr
作为参数或返回值时, 可以是如下几种形式