c/c++ 智能指针 unique_ptr 使用

智能指针 unique_ptr 使用

和shared_ptr不同,可以有多个shared_ptr指向同一个内存,只能有1个unique_ptr指向某个内存。因此unique_ptr不支持普通的拷贝和赋值。

一,先来个表格,唠唠unique_ptr

操作功能描述
unique_ptr<T> u(q)智能指针u管理内置指针q所指向的对象;q必须指向new分配的内存,且能够转换为T*。
unique_ptr<T, D> u(u, d)用类型为D的对象d来代替delete
u = nullptr释放u指向的对象,并将u置为空
u.release()u放弃对指针的控制权,返回内置指针,并将u置为空
u.reset()释放u所指向的对象,并将u置为空。
u.reset(q)如果还传递了参数q,让u指向q
u.reset(q, d)如果还传递了参数d,将会调用d,而不是delete来释放q
小例子索引
代码块功能描述
test1不可以拷贝和赋值
test2自定义删除器
test3reset和release的使用
test4unique_ptr作为函数的返回值
小例子
include <iostream>
#include <memory>
#include <vector>

using namespace std;

class Test{
public:
  Test(int d = 0) : data(d){cout << "new" << data << endl;}
  ~Test(){cout << "del" << data << endl;}
private:
  int data;
};
void my_deleter(Test* t){
  cout << "worked" << endl;
}
unique_ptr<int> cl1(int p){
  return unique_ptr<int>(new int(p));
}
unique_ptr<int> cl2(int p){
  unique_ptr<int> rt(new int(p));
  return rt;
}
void fl1(unique_ptr<int> p){
  *p = 100;
}

int main(){
  //test1 不可以拷贝和赋值                                                      
  /*                                                                            
  unique_ptr<int> p1(new int(11));                                              
  //unique_ptr<int> p2(p1);//NG                                                 
  unique_ptr<int> p3(new int(10));                                              
  //p3 = p1;//NG                                                                
  */

  //test2 自定义删除器                                                          
  //不再调用Test的析构函数了                                                    
  //unique_ptr<Test, decltype(my_deleter)*> u(new Test(1), my_deleter);         

  //test3 reset和release的使用
  /*                                                                            
  unique_ptr<Test> p1(new Test(1));                                             
  unique_ptr<Test> p2(p1.release());//将p1置为空,p2指向了原来p1指向的对象 
  unique_ptr<Test> p3(new Test(3));                                             
  p2.reset(p3.release());//先释放了p2所指向的内存,让p2指向了原来p3指向的对象,p3被置为空
  p2.release();//错误,p2不会释放内存,而且丢失了能够释放内存的指针
  auto p = p2.release();//正确,但必须要记得delete(p)                           
  */

  //test4 unique_ptr作为函数的返回值                                            
  /*                                                                            
  unique_ptr<int> p1 = cl1(11);                                                 
  cout << *p1 << endl;                                                          
  unique_ptr<int> p2 = cl2(22);                                                 
  cout << *p2 << endl;                                                          
  //fl1(p2);//NG 编译不过                                                       
  */
}

github完整代码

c/c++ 学习互助QQ群:877684253

1414315-20180928082348102-695870753.jpg

本人微信:xiaoshitou5854

转载于:https://www.cnblogs.com/xiaoshiwang/p/9716650.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值