unique_ptr<T> u1; //u1是一个空的T类型的智能指针
unique_ptr<T, D> u2; // u2,空的类型为T的智能指针 自定义的释放函数类型为D
unique_ptr<T, D> u(d); // 空的智能指针u 类型为T 自定义释放函数的类型为D 函数名为d
u = nullptr; //将u置为空 同时释放u指向的空间
u.release(); //u放弃对空间的控制权 返回指针 并将u置空
u.reset(); // 释放u指向的对象 将u置空
u.reset(q); //将u重新指向内置指针q指向的空间 原来的空间释放
u.rsset(nullptr);
unique_ptr<string> p2(p1.release()); //release 将p1置为空的同时将内存指针赋给p2
unique_ptr<string> p3(new string("Trex"));
p2.reset(p3.release()); // 将p3置空的同时 p2接管原来p3的内存空间
一种错误的操作:
p2.release(); //p2是置空了 但是p2原来指向的内存还未被释放
auto p = p2.release(); //正确 有变量重新接管原来p2的内存
向unique_ptr传递删除器:
//p指向一个类型为objT的对象,并使用一个类型为delT的对象释放objT对象
//它调用一个名为fcn的delT类对象
unique_ptr<objT, delT> p(new objT, fcn);
一个具体的例子:
void f(destination &d /* 其它需要的参数 */)
{
connection c = connect(&d); //打开连接
//当p被销毁时 连接将会关闭
unique_ptr<connection, decltype(end_connection)*> p(&c, end_connection);
//使用连接
//当f退出时(及时是由于异常而退出), connection会被正确关闭
}
decltype(end_connection)* 这句有点儿迷 根据前面的介绍:
decltype(f()) sum = x; //sum的类型就是函数f的返回类型
而这里函数end_connection的类型确是void不知道他是怎么正确得到类型的。但是 前面的是f() 这里只有函数名 得到的是函数类型 加上*后变成了函数类型的指针 即该指针指向一个函数。
疑问 上面的类型为D的可调用对象中的类型为D指的就是 函数类型的指针类型吗? 如果这里直接就是函数名可不可以呢?
猜测不可以因为这里的参数是一个数据类型而非数据 如果直接是函数名的话就变成一个数据了。
借机复习一下decltype:
decltype赋值变量的数据类型的全部特征包括const和引用的特性。
const int ci = 0; &cj = ci;
decltype(ci) x = 0; // x为const int型 初值为0
decltype(cj) y = x; // y为const int型的引用 初值为0 y绑定到变量x
decltype(cj) z; //错误 const 型的引用必须初始化
int i = 42, *p = &i, &r = i;
decltype(r + 0)b; //b为未初始化的int型
decltype(*p) c; //引用必须绑定到一个变量
//decltype的表达式如果是加上了括号的变量,结果必将是引用
decltype((i)) d; //错误 d是int& 必须初始化