c++智能指针

智能指针:智能指针也是模版,在头文件<memory>中

shared_ptr:允许多个指针指向同一个对象。shared_ptr<string> p; 可以指向string类型的智能指针。会自动销毁所管理的对象,还会自动释放相关联的内存。

unique_ptr:独占所指向的对象。

weak_ptr:是一种弱引用,指向shared_ptr所管理的对象。*/

 

shared_ptr<int> sp;

unique_ptr<int> up;

 

智能指针的操作

p.get:返回p中保存的指针,若智能指针释放了其对象,返回的指针所指向的对象也消失

p.awap(q):交换p和q中的指针

p.unique:若p.use_count为1,则返回true,否则返回false。shared_ptr独有操作

p.use_count:返回与p共像对象的智能指针数量。shared_ptr独有操作

 

make_shared:在动态内存中分配一个对象并初始化它,返回值指向此对象的shared_ptr*/

 

shared_ptr<int> sp1 = make_shared<int>(77);

auto sp2 = make_shared<vector<string>>();

 

shared_ptr自动销毁所管理的对象,当指向一个对象的最后一个shared_ptr被销毁时,shared_ptr会自动销毁此对象。

是通过析构函数实现的,当引用计数为0时销毁,还会自动释放相关联的内存。

 

直接管理内存

使用new动态分配和初始化对象int* p = new int;//可以初始化也可以不初始化

动态分配的const对象,const int* p = new const int(1024);

内存耗尽,返回空指针

动态释放内存,delete p;

指针和delete,不是释放非new创建的内存,不能将相同指针值多次释放

动态对象的生存期直到被释放时为止

delete之后重置指针值,提供有限的保护。delete p; p = nullptr;

 

 

shared_ptr和new的结合

不要混合使用普通指针和智能指针

不要使用get初始化另一个智能指针或为智能指针赋值*/

 

 

unique_ptr操作

u.release:u放弃对指针的控制全,赶回指针,并将u置空

u.reset:释放u指向的对象

u.reset(q):如果提供了内置指针q,令u指向这个对象,否则置为空

 

unique_ptr不支持普通的拷贝或赋值操作

当定义一个unique_ptr时,需要将其绑定到一个new返回的指针上

 

unique_ptr<string> unp1(new string("asfg"));

unique_ptr<string> unp2(p1);//错误 unique_ptr不支持拷贝

unique_ptr<string> unp3;

unp3 = unp1;// 错误 unique_ptr不支持赋值

 

weak_ptr操作

weak_ptr是一种部控制所指向对象生存期的智能指针

w.reset():将w置为空

w.use_count:与w共享对象的shared_ptr的数量

w.expired:若use_count为0返回true,否则返回false

w.lock:如果expired为true,返回一个空shared_ptr,否则返回一个指向w的对象的shared_ptr

 

weak_ptr是一种不控制所指向对象的生存期的智能指针,它指向一个shared_ptr管理的对象。

将一个weak_ptr绑定到一个shared_ptr不会改变shared_ptr的引用计数,

就是最后的shared_ptr被销毁,即使有weak_ptr指向该对象,也会被销毁。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值