1.从一个unique_ptr直接赋值给另一个unique_ptr是合法的,比如
ptr = std::unique_ptr<ClassA>(new ClassA)
但是下面的写法不对:
ptr1=ptr2;
出处 Nicolai Josuttis <c++ 标准库> 第二版,中文版 102页
2.但是将一个unique_ptr作为输入参数传给函数时,可以采用如下两种办法:
2-1)左值引用。在调用函数后,unique_ptr指针仍然占有指向的资源。
std::unique_ptr<...> up(...);
void func(std::unique_ptr<...> &);
.....
func(up);
2-2)
std::unique_ptr<classX> up(...);
void func(classX &);
.....
func(*up);
甚至还有一种右值引用的办法。采用这种办法,在调用函数后,unique_ptr指向的资源就被释放了
std::unique_ptr<...> up(...);
void func(std::unique_ptr<...> );
.....
func(std::move(up));
出处 Nicolai Josuttis <c++ 标准库> 第二版5.2节,中文版 102页
3.假如一个函数的返回值是unique_ptr,则在函数结尾直接写return unique_ptr<…>;即可。如下:
std::unique_ptr<...> func()
{
std::unique_ptr<...> up(...);
return up;
}
调用这个函数时,理论上要在函数外面包括一个std::move:
std::unique_ptr<..> up = std::move(func());
但是实际上,可以省去move函数,原因是c++11规定,编译器应自动尝试加上move.
出处 Nicolai Josuttis <c++ 标准库> 第二版5.2节,中文版 103页
4.也可以用make_unique直接给unique_ptr赋值
5.对数组来说,假如unique_ptr的尖括号<>包括的类型是数组,则即使没有明确指明deleter,unique_ptr销毁时,数组仍会以delete []的方式释放。
假如尖括号<>包括的不是数组,但实际上unique_ptr管理的是数组,则应将一个能够释放数组的deleter分配给unique_ptr.
c++11提供std::default_delete函数满足这个要求。