本文共 1536 字,大约阅读时间需要 5 分钟。
1.C++中的内存分为五大区域:
(1) 栈 存放局部变量,函数形参 调用函数式系统会自动分配一个栈
(2) 堆 存放由new存放的内存块,如果没有使用delete及时清理,会造成内存泄露
(3) 自由存储区 存放由malloc申请的内存块,
(4) 全局变量/静态变量区 存放全局变量静态变量
(5) 常量区 存放整数字符串等的常量
堆和栈的区别:
栈由系统自动分配,堆由程序员自己申请,系统在内存中寻找空闲的内存,将对应的内容写入空闲的内存。栈申请效率高,但大小有限制,堆申请效率较低。栈向低地址方向生长,堆向高地址方向生长。
代码:
# includeusing namespace std;# include int global=1; //全局/静态变量区int main(){int a;char b[12];char *c=new char (); //栈区char *e=(char *)malloc(8*sizeof(char)); //分配的内存块在堆中,指针e在栈中int d=5; //常量区return 0;}
上面的代码产生的汇编代码是:
gdb) disas mainDump of assembler code for function main: 0x004016b0 <+0>: push %ebp 0x004016b1 <+1>: mov %esp,%ebp 0x004016b3 <+3>: and $0xfffffff0,%esp 0x004016b6 <+6>: sub $0x30,%esp 0x004016b9 <+9>: call 0x401d00 <__main> 0x004016be <+14>: movl $0x1,(%esp) 0x004016c5 <+21>: call 0x401760 <_Znwj> 0x004016ca <+26>: movb $0x0,(%eax) 0x004016cd <+29>: mov %eax,0x2c(%esp) 0x004016d1 <+33>: mov $0x8,%eax 0x004016d6 <+38>: mov %eax,(%esp) 0x004016d9 <+41>: call 0x4037280x004016de <+46>: mov %eax,0x28(%esp) 0x004016e2 <+50>: movl $0x5,0x24(%esp) 0x004016ea <+58>: mov $0x0,%eax 0x004016ef <+63>: jmp 0x4016f9 0x004016f1 <+65>: mov %eax,(%esp) 0x004016f4 <+68>: call 0x401f70 <_Unwind_Resume> 0x004016f9 <+73>: leave 0x004016fa <+74>: retEnd of assembler dump.(gdb)
由汇编代码可知,指针c位于栈偏移0x2c的位置,指针e位于栈偏移0x28的位置,整数d位于栈偏移0x24的位置,变量a和b由于未初始化,没有分配内存。
转载地址:http://nmwp.baihongyu.com/