美文网首页Exceptional C++
【Exceptional C++(19)】内存管理(一)

【Exceptional C++(19)】内存管理(一)

作者: downdemo | 来源:发表于2018-01-30 12:19 被阅读11次
  • C++有几个不同的内存区域,用来存储对象或其他类型的值,每一个区域有其各自的特点

常量数据区(const data)

  • 存储字符串等在编译期间就能确定的值
  • 类对象不能存在于这个区域中
  • 在程序整个生命周期,区域中的数据都是可用的
  • 区域中所有数据都是只读的,任何修改本区数据的行为都会造成无法预料的后果

栈区(stack)

  • 存储自动变量
  • 分配操作比heap或free store快,因为stack的分配只涉及一个指针的递增
  • 内存一旦分配对象就构造好了,对象一旦销毁分配的内存也立即收回
  • 程序员无法直接操控已被分配但未初始化的stack空间

自由存储区(free store)

  • C++的两个动态内存区域之一,用new和delete分配和释放
  • 对象的生存周期可以比存放它的内存区的生存周期短,可以获得一片内存区而不用马上初始化,对象销毁后也不用马上收回其占用的内存区
  • 对象被销毁而内存区未被收回的期间可以通过void*指针访问这片区域,但其原始对象的非静态成员以及成员函数(即使知道地址)都不能被访问或操控

堆区(heap)

  • 另一个动态存储区域,使用malloc、free及一些相关变量进行分配和回收
  • 虽然特定编译器中缺省的全局运算符new和delete会按malloc和free的方式实现,但是heap与free store是不同的,在某一个区域内被分配的内存不可能在另一个区域内被安全回收
  • heap中被分配的内存一般用于存放在使用new的构造过程中和显式析构过程中涉及到的类对象
  • heap中对象的生存周期与free store中的类似

全局/静态区(Global/Static)

  • 内存区域在程序启动时才被分配,可能直到程序运行时才初始化,比如函数静态变量在程序第一次执行到定义该变量的代码时才被初始化
  • 对跨越了编译单元的全局变量进行初始化操作的顺序没有明确定义
  • 没有初始化的对象存储区域可以通过void*来访问和操控,但在对象的生存周期之外非静态成员和成员函数无法被使用或引用

相关文章

  • 【Exceptional C++(19)】内存管理(一)

    C++有几个不同的内存区域,用来存储对象或其他类型的值,每一个区域有其各自的特点 常量数据区(const data...

  • 2020-03-11 c++ book

    exceptional c++ style 中文版more exceptional c++ 中文版exceptio...

  • 【Exceptional C++(20)】内存管理(二)

    问题 找出下列代码中与内存有关的错误 解答 B的delete有第二个参数而D没有,这是出于个人喜好,两种写法都可行...

  • c++内存管理

    c++内存管理长文 c++内存管理

  • 内存管理

    内容包括: C++内存管理 Java内存管理 C++内存管理 内存分配方式 在C++中,内存分成5个区,分别是栈、...

  • 书签

    笔记 C++ PrimerEffective C++Exceptional C++Effective STLC++...

  • 书签

    笔记 C++ PrimerEffective C++Exceptional C++Effective STLC++...

  • C++之内存布局

    在C++之内存管理一文中,我们已经了解到C++的内存管理,这里介绍C++的典型内存布局结构。 1、总体来说,C/C...

  • Java GC

    概述 GC => 垃圾回收 = 回收可用空间 + 压缩内存 内存管理 手动内存管理 => C | C++ 自动内存...

  • C++ 内存分配和管理

    C++ 内存分配和管理

网友评论

    本文标题:【Exceptional C++(19)】内存管理(一)

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