unique_ptr<double> p1;//正确unique_ptr<int> p2(new int(42));//正确unique_ptr<int> p3 = new int(42);//错误
unique_ptr<string> p1(new string("HelloWorld"));unique_ptr<string> p2(p1);//是错误unique_ptr<string> p3;p3 = p1;//错误
//因为在函数内部的unique_ptr指针随着作用域的结束会自动销毁,因此可以将其作为返回值,然后将内存传递给另一个unique_ptr指针管理
unique_ptr<int> clone(int p)
{
return unique_ptr<int>(new int(p));
}
/*unique_ptr<int> clone(int p)
{
unique_ptr<int> ret(new int(p));
return ret;
}*/
int main()
{
unique_ptr<int> p = clone(10);
cout <<*p << endl; //打印10
return 0;
}
unique_ptr<string> p1(new string("Hello"));unique_ptr<string> p2(p1.release());//p1将自己所指的内存空间置空,并且返回该内存空间。之后对该内存空间的操作权消失,从而p2得到该内存的权限
注意事项:
unique_ptr<string> p1(new string("Hello"));p1.release();//错误,虽然p1断开了与内存的关系,但是没有另一个unqieu_ptr来接手这块内存,造成内存泄漏/*改正:unique_ptr<string> p2(p1.release()); //将p1的原来内存交给另一个unique_ptr管理*/
unique_ptr<string> p1(new string("Hello"));
p1.reset();//将p1置空,不指向内存对象
unique_ptr<string> p1(new string("Hello"));
p1.reset(nullptr);//同上
unique_ptr<string> p1(new string("Hello"));
unique_ptr<string> p2(new string("World"));
p1.reset(p2.release());//p2置空之后,然后p1也置空,然后p1来接手p2所指向的内存
//p指向一个类型为objT的对象,并使用一个类型为delT的对象释放objT对象//它会调用一个名为fcn的delT类型对象unique_ptr<objT,delT> p(new objT,fcn);
void f(destination &d)
{
connection c=connec(&d);
unique_ptr<connection,decltype(end_connection)*> p(&c,end_connection);
...//使用这个连接
//当f函数退出或者异常退出,p都会调用end_connection函数
}
unique_ptr<int[]> arr(new int[3]{ 1,2,3 }); //定义一个指向int型数组的智能指针对象unique_ptr<int[]> arr2(new int[3]);arr.release(); //自动调用delete[]销毁其指针
unique_ptr<int[]> arr= new int[3]{ 1,2,3 }; //错误
unique_ptr<int[]> arr(new int[3]{ 1,2,3 });for (int i = 0; i < 3; ++i)arr[i] = i;