美文网首页
C++primer_内存

C++primer_内存

作者: m风满楼 | 来源:发表于2018-09-18 18:30 被阅读0次

十二:动态内存

  • <memory>头文件
  • 动态内存对象只有在被显示释放的时候,才会被销毁。动态内存的释放极其容器出错,为了解决这个问题,C++提供了智能指针类型管理动态分配的对象。当一个对象应该被释放的时候,指向他的智能指针可以确保自动释放它。
  • 程序用堆来存储动态分配的对象--即程序运行过程中分配的对象,
12.1动态内存与智能指针
  • 程序中动态内存通常使用new来分配。返回一个指向该对象的指针
  • delete接受一个指向动态对象的指针,销毁该对象并释放该对象空间。
  • 为了解决动态内存释放问题,C++提供了两个智能指针,它行为和普通指针一样,但是可以自动释放所指向的对象。
    • shared_ptr :允许多个指针可以指向同一个对象。
    • unique_ptr :该指针独占一个对象。
    • 标准库还定义了一个名为weak_ptr的伴随类,它是一种弱引用,指向shared_ptr所管理的对象。以上三种类型均定义在memory头文件中。
  • 智能指针也是模板,因此使用必须给出需要管理的指针类型,如:
shared_ptr<string> p1;    // shared_ptr,可以指向string
  • 默认初始化的智能指针中保存着一个空指针。智能指针的使用方式与普通指针类似。解引用一个智能指针返回它指向的对象。如果在一个条件判断中使用智能指针,效果就是检测它是否为空。
    shared_ptr与unique_ptr都支持的操作
shared_ptr<T> sp、unique_ptr<T> up:空智能指针,可以指向类型为T的对象。
p:将p用作一个条件判断,若p指向一个对象,则为true。
*p:解引用p,获得它指向的对象。
 p->mem:等价于(*p).mem。
p.get():返回p中保存的指针。要小心使用,若智能指针释放了其对象,返回的指针所指向的对象也就消失了。此函数是为了这样一种情况而设计的:我们需要向不能使用智能指针的代码传递一个内置指针。使用get返回的指针的代码不能delete此指针。
swap(p, q)、p.swap(q):交换p和q中的指针。

shared_ptr独有的操作

 make_shared<T>(args):返回一个shared_ptr,指向一个动态分配的类型为T的对象,使用args初始化此对象。
shared_ptr<int> p2 = make_shared<int>(42);
shared_ptr<string> p3 = make_shared<string>(10, 'a');
shared_ptr<T> p(q):p是shared_ptr q的拷贝;此操作会递增q中的计数器。q中的指针必须能转换为T*,此构造函数是explicit的,q可以是new生成的普通指针。
p = q:p和q都是shared_ptr,所保存的指针必须能相互转换。此操作会递减p的引用计数,递增q的引用计数;若p的引用计数变为0,则将其管理的原内存释放。这里的q不能是普通指针。
p.unique():若p.use_count()为1,则为true,反之为false。
p.use_count():返回与p共享对象的智能指针数量;可能很慢,主要用于调试。
  • 最安全的分配和使用动态内存的方式是使用make_shared函数,此函数在动态内存中分配一个对象并初始化它。
    我们通常用auto定义一个对象来保存make_shared的结果,如:
    // p6指向一个动态分配的vector<string>

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

相关文章

  • C++primer_内存

    十二:动态内存 头文件 动态内存对象只有在被显示释放的时候,才会被销毁。动态内存的释放极其容器出错...

  • C++primer_基础

    2.6 自定义数据结构 可以使用struct或者class定义自己的数据结构 为了确保头文件定义的一致性,类通常...

  • C++primer_容器

    九.顺序容器 顺序容器的顺序表示元素插入的顺序 C++标准库容器提供了顺序访问元素的能力,但是不同的容器在以下的操...

  • Linux 内存管理 应用篇

    1、物理内存和虚拟内存 物理内存:物理内存就是系统硬件提供的内存大小,是真正的内存 虚拟内存:为了满足物理内存的不...

  • linux io与zero copy

    1. 物理内存与虚拟内存 1.1 物理内存 物理内存指通过物理内存条而获得的内存空间。 1.2 虚拟内存 虚拟内存...

  • 性能优化<第五篇>:内存优化

    1、为什么要内存优化? 2、了解内存中的内容 3、内存上限 4、GC内存回收机制 5、内存泄漏、内存抖动、内存溢出...

  • JVM第二天-volatile final synchroniz

    1.JAVA内存模型 简单的讲,Java 内存模型将内存分为共享内存和本地内存。共享内存又称为堆内存,指的就是线程...

  • 伙伴算法和slab算法

    0. 内存管理问题 内存碎片太小和管理内存碎片的效率问题 内存碎片:回收内存时,将内存块放入free链表中。因内存...

  • JVM 常见内容汇总

    面试题 对象 对象的创建 分配内存 对象头 内存溢出 内存溢出与内存泄漏 内存溢出:系统无法再分配内存空间。 内存...

  • java内存模型

    1.内存模型(JMM) 1.1什么是Java内存模型? Java内存模型将内存分为主内存和工作内存两大部分;主内存...

网友评论

      本文标题:C++primer_内存

      本文链接:https://www.haomeiwen.com/subject/ndfmnftx.html