这篇文章是围绕本文思路做的一个总结,原文章记录的笔记很详细,在此基础上,我自己总结一下(我想简单点)。如果您想了解具体细节,可以访问这篇文章。文末你交了一段代码,还有程序的内存映射。如有不妥之处,请补充指正。什么是程序抽象地说,当我们打开电脑,点击应用程序图标时,就会运行一个程序,但在操作系统层面,实际上会生成一个进程,它是程序的实体。接下来以linux操作系统来介绍linux中进程的各个段以及它们代表的含义linux虚拟地址空间在linux操作系统中,每当一个进程产生时,它都有一个虚拟地址空间,通常在32位位系统中,其大小为4GB,按3:1的比例分配给用户空间和内核空间。虚拟地址空间的简单工作原理就是通过页表将虚拟地址映射到实际的物理地址(所以在C语言中malloc分配内存时,即使malloc有int大小的空间,实际分配的还是一个page内存,一般为4096字节)用户内存空间的每一段分布代码段:可执行代码、字符串常量和其他数据段:1.数据段:初始化的全局变量,初始值不为0(静态变量)2.bss段:未初始化的,或者初始值为0的全局变量(静态变量)Heap:可以理解为程序员为程序中的变量分配的内存(需要手动释放)Stack:保存的时候函数被调用所需的局部变量、函数参数和返回地址。当进程产生很多线程时,线程堆栈也保存在这里。说到底,栈也是一种数据结构。它遵循先进后出的顺序,所以特别适合函数执行(入栈)和函数返回(出栈)。堆栈的三种用途:1.为函数内部声明的局部变量(非静态局部变量)分配内存空间。2.记录函数调用信息,用栈帧表示。除了函数的返回地址外,还有一些进出寄存器的变量。3、暂存区,用于暂存长算术表达式的部分计算结果或alloca()函数分配的栈中的内存。(我不是很清楚)在此基础上,往往会导致一个编程问题,即:栈溢出,这种情况尤其出现在递归调用中,除了申请内存,不释放外,还很可能导致内存泄漏。要避免这种情况,需要注意内存的释放。一般来说,一个new对应一个delete。在linux中,可以使用ulimit-s查看栈的大小。下面是我的linux系统中栈的大小[m@m~]$ulimit-s8192Heap堆是程序运行时动态分配内存的内存段。通常使用malloc和new(底层也是malloc)获取一块内存空间,使用free和delete释放已使用的内存空间。常见问题:由于是程序员手动创建的,所以一定要注意内存释放。问题是类和main函数中动态分配的内存一般都能释放,但有时其他函数中new的内存空间,,却没有删除,导致内存泄漏。多次运行该函数,程序可能会崩溃。#include
