1 。 每次都会遇到这个问题,一直是看了又忘,忘了又看。本文主要简介一下c中的内存类型和布局问题。
2。内存的类型
(1)栈区(stack):由编译器自动分配和释放的,存放函数的参数值、局部变量的值等。操作方式类似数据结构中的栈。
在函数参数和地址入栈情况中,一般是从左向右将变量入栈,最后函数的地址入栈。
(2)堆区(heap):由程序员手动分配和释放,完全不同于数据结构中的堆,分配方式类似链表。即由malloc或new来分配,free和delete释放。
(3)全局区(静态区):全局变量和静态变量的内存是存储放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,
程序员结束后由系统释放。
(4)文字常量区:常量字符串放在这里。程序结束时系统释放。
(5)程序代码区:存放函数体的二进制代码。
下面是一段程序代码,具体说明:
int a = 0; //存放在全局初始化区
char *p1; //存放在全局未初始化区
int main()
{
int b; //存放于堆栈中,即栈中。
char s[] = "abc"; //存放于堆栈中, 即栈中。
char *p2; //存放于堆栈中,即栈中。
char *p3 = "123456"; //p3本身是存放在堆栈中,"123456"是存放在常量区中
static int c = 0; //存放在全局初始化区
p1 = (char*)malloc(10); //存放在堆中,由程序员手动释放。
p2 = (char*)malloc(20); //存放在堆中
strcpy(p1, "123456");
//"123456"在常量区。编译器可能会将它与p3所指向的"123456"优化成一个地方。
free(p1);
free(p2);
}
3 内存空间分配
对一个进程的内存空间分配,主要是代码区,静态数据区和动态数据区。c语言中有全局变量,本地变量,静态变量和寄存器变量。
静态数据区包括了全局变量和静态变量。动态数据区包括了堆,栈(堆栈)数据内容,编译的二进制代码就放在代码区。
├———————┤低端内存区域
│ …… │
├———————┤
│ 动态数据区 │
├———————┤
│ …… │
├———————┤
│ 代码区 │
├———————┤
│ 静态数据区 │
├———————┤
│ …… │
├———————┤高端内存区域
3. 内存泄露问题
vc6.0里面的一种简单的检测内存泄露的方法。首先包含了下面的头文件
#define _CRTDBG_MAP_ALLOC
#include<stdlib.h>
#include<crtdbg.h>
注意:#include 语句的顺序。如果更改此顺序,所使用的函数可能无法正确工作。
然后在需要检测内存泄露的地方加入_CrtDumpMemoryLeaks();语句即可。
调试时使用Debug模式来调用,即会在输出信息的窗口出现相关内存信息。