程序的内存布局

大多数的操作系统中,都会有一部分空间是程序无法访问的,这是内核空间,专门留给操作系统内核使用的。一个进程的空间中,有4个部分,分别是:

  • 栈:维护函数调用的上下文,一般分配在用户空间的最高地址
  • 堆:容纳程序动态申请的内存,比如C++的new或者malloc申请的。堆一般位于栈的下方。
  • 可执行文件映像:存储着可执行文件在内存里的映像
  • 保留区:内存中收到保护而禁止访问的区域的总称


程序中的段错误,就是程序操作了不允许访问的地址造成的。一般来说,这都是由非法指针解引用造成的,出现这种情况首先应当检查指针的调用情况。

栈与调用管理

在操作系统中,表示具有栈属性的动态内存总称。栈保存了函数调用所需要的维护信息,这些一般被称为堆栈帧活动记录,堆栈帧一般包括:

  • 函数的返回地址和参数
  • 临时变量:函数的非静态局部变量和编译器自动生成的其它临时变量
  • 保存的上下文:函数调用前后需要保持不变的寄存器。上下文的理解,请参考这篇博客。通俗的讲,就是程序执行需要的外部信息,类似于文章中的语境。

一个栈的内存结构:

一个函数的调用,在i386中,一般是这样的:

  • 参数压入栈中
  • 当前指令的下一个指令地址压入栈中
  • 跳到函数体执行

堆与内存管理

栈的数据在函数返回的时候就会被释放掉,所以无法传递到函数的外部。全局变量等,只能在编译期间进行处理,此时需要堆进行操作。

程序在堆中申请的数据,只能手动进行释放,如果丢失掉申请的地址,那么会造成无法释放的现象,要格外注意这种情况。关于Linux、Windows等的堆管理之类的算法,可以具体查阅资料。

程序员的自我修养笔记3 内存管理相关推荐

  1. 程序员的自我修养笔记(持续更...)

    文章目录 程序员的自我修养 1.基础知识 2.编译和链接 2.1被隐藏的过程 2.1.1预编译 2.1.2 编译 2.1.3 汇编 2.1.4 链接 2.2 编译器做了什么 2.2.1 词法分析 2. ...

  2. 程序员的自我修养笔记之装载

    可执行文件的装载与进程 介绍ELF文件在Linux下的装载过程,探寻可执行文件装载的本质 什么是进程的虚拟地址空间 为什么进程要有自己独立的虚拟地址空间 几种装载方式 进程虚拟地址空间的分布情况 进程 ...

  3. 程序员的自我修养笔记(一)

    一..牵扯到"计算"这个概念的都可以成为计算机,我们研究的主要是兼容x86指令集的32位CPU个人计算机. 1. 早期:CPU和内存的频率差不多,连接在同一个总线上. I/O设备效 ...

  4. 程序员的自我修养笔记 2

    编译的基本流程 构建:编译和链接合并到一起的过程. 整个编译的过程可以分为4个阶段: 预处理:主要是处理#符号后面的内容,比如展开宏定义和处理ifndef等:还包括删除掉所有的注释等.还有一个重要的步 ...

  5. 【读书笔记】程序员的自我修养总结(七)

    [读书笔记]程序员的自我修养总结(七) 标签: [编程开发] 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:这是程序员的自我修养一书的读书总结,随着阅 ...

  6. 【读书笔记】程序员的自我修养总结(一)

    程序员的自我修养总结(一) 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:这是程序员的自我修养一书的读书总结,随着阅读的推进,逐步增加内容. 1. 关 ...

  7. 程序员的自我修养读书笔记-1

    前序:作为一个马上就要工作的非科班本科生,前段时间为了找工作,有针对性的学习了一些编程语言,数据结构,网络方面的知识,学的非常浅,非常杂乱,存粹是为了应对找工作.现在空下来了,想着以后应该就是走程序员 ...

  8. 《程序员的自我修养》阅读笔记(一)

    这本书的初版是2009年出版的,但是其理论知识放在2021年仍然管用,十多年计算机的框架并没有发生大的变化.这本书讲解了一门编程语言是如何诞生的,通过这本书,可以理解一些操作系统和软件的运行机制和原理 ...

  9. 【读书笔记】【程序员的自我修养 -- 链接、装载与库(三)】函数调用与栈(this指针、返回值传递临时对象构建栈、运行库与多线程、_main函数、系统调用与中断向量表、Win32、可变参数、大小端

    文章目录 前言 介绍 内存 内存布局 栈与调用惯例 堆与内存管理 运行库 入口函数和程序初始化 C/C++运行库 运行库与多线程 C++全局构造与析构 fread 实现 系统调用与API 系统调用介绍 ...

最新文章

  1. 【Web安全】php://filter 的浅略底层分析
  2. 实例讲解Oracle数据库设置默认表空间问题
  3. CAS Server(一):搭建服务端
  4. is transfer = C ( only read dynamically) not supported in one order scenario
  5. android注册界面高级,Android用户注册界面简单设计
  6. 揭秘.NET Core剪裁器背后的技术
  7. egg前面加什么_国威说阀:阀门前面为什么加国标美标日标之类的?
  8. 谈谈枚举和 那啥 那啥来着 哦 对对对 泛型!
  9. 欧几里得算法、扩展欧几里得算法、求逆元、中国剩余定理、扩展中国剩余定理
  10. IDL 读取葵花8(Himawari-8)HSD数据
  11. 虚拟机win 7 上安装VWware Tools提示升级系统到SP1
  12. MySQL运算符介绍(萌新必备!!)
  13. 云控微信开发SDK使用教程--手机微信群聊删除通知服务端
  14. ubuntu18.04安装0.6以上版本的flameshot
  15. ZY Player 2.8.3 中文版 (全网视频播放器)
  16. anaconda利用pip安装module
  17. 初学Java 从0-1创建Spring boot+Mybatis - plus+Swagger2+Mysql(代码生成器)
  18. N1盒子单臂路由设置
  19. 5.1 c++ STL 容器适配器简介
  20. 《天龙八部》之《少年游》

热门文章

  1. PHP lareal_怎么样能在mysql里结合php的函数
  2. 【机器学习-西瓜书】六、支持向量机(SVM):最大间隔;对偶问题;KKT条件
  3. 4-1 可复用性概述
  4. CGVAE -> Delinker -> DeepCoy
  5. 10行代码解析krc歌词文件
  6. 【oracle】除数为0
  7. 你有多温柔,就有多强大
  8. B树和B+树详细解析
  9. 使用iView构建Vue项目步骤
  10. Python:SyntaxError: unexpected EOF while parsing