C++11 智能指针

2021-04-10 11:26

阅读:440

标签:count   带来   退出   弊端   pre   智能   har   uniq   赋值   

前言

  • 智能指针可以对动态资源进行管理,保证任何情况下,已经构造的对象能够安全的自动销毁。说人话就是防止内存泄漏。
  • C++里面共有四个智能指针:auto_ptr、unique_ptr、shared_ptr、weak_ptr,第一个已经C++11抛弃,后三个是c++11所支持。

auto_prt 所有权模式

auto_ptr ap1 (new string ("hello,world")); 
auto_ptr ap2;
ap2=ap1
//这里不会报错,ap2剥夺ap1的权限,但程序访问ap1会报错,ap1被废弃。auto_ptr缺点是:存在潜在的程序崩溃问题。

unique_ptr 独占指针

  • 独占指针所指向的内存为自己独有,同一时刻只能有一个unique_ptr。指向给定的对象unique_ptr 对象不支持同类赋值和拷贝。

unique_ptr up1(new int(2333));
unique_ptr up2 = up1;//这里会报错,尝试引用已删除的函数。

//将原来up1指向内存交由up3指向
unique_ptr up3 = std::move(up1);
cout  up4(new int(2333));
up4.reset(new int(9999));//将原来指向的2333删除掉重新指向9999
cout  up5(new int(777));
int* p5 = up5.release();//将内存的控制权交给接受的指针,自己赋值为nullptr,但是没有删除
//cout 

shared_ptr 共享指针

  • 允许多个该智能指针共享一个堆内存。通过引用计数来实现共同管理和安全释放,只有引用计数为0的时候才会删除该对象的内存,支持赋值和拷贝的
shared_ptr sp1(new int(123));
cout  sp2 = sp1;//增加了引用计数
cout  sp3(new int(456));
sp2.swap(sp3);//将sp2指向和sp3指向进行了交换,对应的引用计数的变化要清楚
cout  sp4 = sp2;
//获取共享指针的原始指针
int* p = sp2.get();
cout  sp5 = make_shared();
cout  sp6 = make_shared(9527);
cout  sp7 = make_shared(10, ‘9‘);
cout 

weak_ptr 弱指针

  • 主要是为了配合shared_ptr而引入的一种智能指针,只要为了解决循环引用的问题。
  • 可以从一个shared_ptr或者另一个weak_ptr对象来构造,但是它的构造和析构不会对引用计数产生实质的影响。
  • 并且没有重载*,->这样的指针操作,也就是说weak_ptr对象是没有办法当做指针直接使用的。如果要使用,可以通过lock函数获得一个shared_ptr对象来使用。
shared_ptr aa = make_shared();
shared_ptr bb = make_shared();
//执行结束以后内存没有被释放,循环引用导致的
aa->b = bb;//2
bb->a = aa;//2

//改用弱指针可以消除循环引用的弊端
aa->wb = bb;//1
bb->wa = aa;//1

总结

  • 智能指针虽然帮忙管理内存,但是带来程序运行效率的下降。
  • 主要根据自己的需求来灵活使用。

C++11 智能指针

标签:count   带来   退出   弊端   pre   智能   har   uniq   赋值   

原文地址:https://www.cnblogs.com/biu-we/p/13367198.html

上一篇:python操作es

下一篇:python txt装换成excel


评论


亲,登录后才可以留言!