c++常用智能指针总结

智能指针的目的主要是为了防止new和delete没有合理搭配使用而造成的内存泄漏(忘记delete)。
其实现原理是将普通指针封装为一个对象,当该指针对象的生存周期结束后,自动调用其析构函数对new的内存进行释放。
介绍c++中常用的3个智能指针: share_ptr,weak_ptr,unique_ptr 。[注:所在头文件]

一 本人最常用的——share_ptr

构造:
shared_ptr p1(new T(1));//这样构造可以,不能用new出来的指针赋值
shared_ptr p2 = make_shared(2);
shared_ptr p3(p2);
shared_ptr p4=p3;
特点:
允许多个shared_ptr指针指向同一对象,采用引用计数,每增加一个指向对象的指针的时候,引用计数值加一,每当一个对象离开作用域析构时,引用计数值减一,当引用计数值为零时,释放内存。
常用成员函数:
假设指针为p
①p.get() //返回p中保存的指针
②if§ //如果p指向一个对象,返回一个true
③swap(p,q)等价于p.swap(q) //交换p,q的指针
④p.use_count() //返回与p共享的智能指针数量
⑤p.unique() //如果计数值为1,返回true;否则返回false
⑥p.reset(); //释放指针对对象的引用
⑦p.reset(q); //释放原p,将q给p

二 智能指针——unique_ptr

构造:
unique_ptr p1(new T(1));
unique_ptr p2=p1; //不可以这样赋值
unique_ptr p3=move(p1);//转移所有权,此时,p3指向p1曾经指向的内存,p1变为无效指针
unique_ptr p4=std::make_unique(); //c14标准
特点:
它拥有对所指向对象的唯一所有权,即二者是一一对应的,不能两个unique_ptr指针指向同一个对象。
当它指向其他对象时,之前所指向的对象会被摧毁。
当其未指向对象时,unique_ptr的状态为empty
常用成员函数:
p.reset();//释放内存. 如果括号里面有参数,则释放内存后接手新的对象的所有权
p.get();//返回p中保存的指针 p等价于p.get()
p.release();//放弃内部对象的所有权,将内部指针置为空, 返回所内部对象的指针, 此指针需要手动释放
p.move(p1);//转移所有权
p.swap(p1); //交换两个对象的所有权

三 智能指针——weak_ptr

构造:
weak_ptr p1(sp); //sp是shared_ptr类型的
weak_ptr p2 =sp;//sp是shared_ptr类型的

特点:
weak_ptr指向由一个shared_ptr管理的对象,但不参与控制所指对象生存周期。
将一个weak_ptr绑定到一个shared_ptr指针上,不会改变shared_ptr的计数器。
一旦最后一个指向对象的shared_ptr被销毁,对象就会被释放,即使有weak_ptr指向这个对象,对象也会被释放。
是为了解决shared_ptr相互引用所出现的内存无法释放的情况:
class A{ shared_ptr m_b;} class B{ shared_ptr m_a;} 如果此时二者相互引用,则析构的时候会因为引用计数不为0而没有释放内存。解决方法是将其中一个成员变量定义为weak_ptr类型。
常用成员函数:
p.reset();//p置为空
p.use_count();//计算与p共享对象的shared_ptr个数
p.expired();//如果p.use_count()为0,返回true
p.lock();//如果p.expired()为true,返回空的shared_ptr,否则返回p指向对象的shared_ptr

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值