/****************************************************************/
/* 学习是合作和分享式的!
/* Author:Atlas Email:wdzxl198@163.com
/* Welcome>晓的博客:zhangxiaolong.org
/* 转载请注明本文出处:
* http://blog.youkuaiyun.com/wdzxl198/article/details/9057695
/****************************************************************/
一 C++内存管理
1.内存分配方式
在讲解内存分配之前,首先,要了解程序在内存中都有什么区域,然后在详细分析各种分配方式。
1.1 C语言和C++内存分配区
下面的三张图,图1图2是一种比较详细的C语言的内存区域分法。图3是典型的C++内存分布图,简单易懂;以下内存分配图,区别就是图1和2则分为初始化和未初始化静态变量区,图3中是全局变量区。
C语言(图1和图2):(由地地址到高地址)
a)正文段:用来存放程序执行代码。通常,正文段是可共享的。另外,正文段常常是只读的,一次防止程序由于意外修改其自身。
b)初始化数据段:用来存放程序中已初始化的全局变量。数据段属于静态内存分配。
c)非初始化数据段:通常称为BSS段, 用来存放程序中未初始化的全局变量。BSS是英文Block Started by Symbol(由符号开始的块)的简称。BSS段属于静态内存分配。 在程序开始执行之前,内核将此段中的数据初始化为0或者空指针。
d)堆:堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc/free等函数分配内存时,新分配的内存就被动态添加到堆上 (堆被扩张)/释放的内存从堆中被剔除(堆被缩减)。
e)栈:栈又称堆栈, 存放程序的局部变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,栈用来传递参数和返回值。由于栈 的先进后出特点,所以栈特别方便用来保存/恢复调用现场。
图1 典型C语言内存分布区域 (UNIX高级环境编程) 图2 典型C语言内存分布区域
C++(图3):
根据《C++内存管理技术内幕》一书,在C++中,内存分成5个区,他们分别是堆,栈,自由存续区,全局/静态存续区,常量存续区。
a) 栈:内存由编译器在需要时自动分配和释放。通常用来存储局部变量和函数参数。