12.1.5节练习

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&  必须初始化

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值