动态内存与智能指针(C++ Primer 笔记)

动态内存与智能指针(C++ Primer 笔记)

  • 每个程序拥有一个内存池,称为“堆”,程序用“堆”来存储动态分配的对象(即在程序运行时分配的对象)。当动态对象不再使用时,必须显示地销毁它们。
  • C++11新标准中提供了两种智能指针管理动态对象,智能指针能够自动释放所指向的对象。shared_ptr允许多个指针指向同一个对象unique_ptr则“独占”所指向的对象weak_ptr是一个弱引用,指向shared_ptr所管理的对象。这三个类型都定义在memory头文件中
    智能指针是类类型,具有析构函数,因此与普通指针不同,智能指针在析构阶段会被自动销毁。
  • 关于shared_ptr
    1、make_shared函数在动态内存中分配一个对象并初始化它。例如 shared_ptr<int> p=make_shared<int>(); //p指向一个值初始化为0的int
    2、每个shared_ptr都有一个引用计数,当拷贝一个shared_ptr,计数器递增。当计数器变为0(即最后一个使用者被销毁时),它就会自动释放动态对象。例如:
    3、无法打破环状引用。例如两个其实已经没被使用的对象彼此互指,因而好像还处于“被使用”状态
auto p=make_shared<int>(42); // p指向的对象只有p一个引用者
auto q(p); // p和q指向相同对象,此对象有两个引用者
  • 程序使用动态内存的3个原因:
    1>程序不知道自己需要使用多少对象。
    2>程序不知道所需对象的准确类型。
    3>程序需要在多个对象间共享数据。
  • 直接管理内存:C++提供new分配内存,delete释放内存。使用内置指针管理的动态内存,在被delete释放前会一直存在。
    如果忘记释放内存,会导致“内存泄漏”,且当发生异常时,内置指针的内存是不会自动释放的。而使用智能指针能有效避免这些错误,即使程序块过早结束*,智能指针也能确保在内存不再需要时将其释放*。
  • 内置指针无法隐式转换为智能指针
Shared_ptr<int>p1=new int(1024);  //错误,必须使用直接初始化形式
Shared_ptr<int>p2(new int(1024));  //正确,P1的初始化隐式要求编译器用new返回的int*创建shared_ptr,而内置指针无法隐式转换为智能指针。
  • 关于unique_ptr
    1、某个时刻只能有一个unique_ptr指向给定的对象独占),当unique_ptr被销毁,它指向的对象也自动销毁。和shared_ptr不同的是,unique_ptr没有make_shared
    定义unique_ptr,需要将其绑定到一个new返回的指针上。unique_ptr<int>p(new int(42));
    2、unique_ptr”独占”对象,所以不能拷贝或赋值,但能通过release、reset将指针所有权从一个unique_ptr转移给另一个unique_ptr。unique_pt<string>p2(p1.release()); //release放弃对指针的控制权,返回指针
    调用release会切断unique_ptr和它原来管理的对象间的联系。release返回的指针通常被用来初始化另一个智能指针或给另一个智能指针赋值。
    u.reset(q) //如果提供了内置指针q,令u指向这个对象。
  unique_ptr<string> p3(new string("xxx"));
  //将所有权从p3转移给p2
  p2.reset(p3.release()); 
  • 关于weak_ptr
  1. weak_ptr是一种不控制所指向对象生存期的智能指针,它指向由shared_ptr管理的对象。将一个weak_ptr绑定到一个shared_ptr不会改变shared_ptr的引用计数。weak_ptr有“弱”共享对象特点。
  2. w.expired() //若w.use_count()为0,返回true
    w.lock() //若expired为true,返回一个空shared_ptr;否则返回一个指向w对象的shared_ptr
  3. 当创建一个weak_ptr时,要用shared_ptr来初始化。auto p=make_shared(42); weak_ptr wp§; //wp和p指向相同对象,由于是弱共享,所以p的计数器不变。
  4. 不能用weak_ptr直接访问对象,必须调用lock。此函数检查weak_ptr指向的对象是否还存在。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值