动态内存分配

来源:互联网 发布:同志交友软件 编辑:程序博客网 时间:2024/06/17 10:25

C语言:malloc/free函数

内存区域

  • data area:全局变量、静态数据、常量
  • code area:所有类成员函数和非成员函数代码
  • stack area:为运行函数而分配的局部变量、函数参数、返回数据、返回地址等
  • heap area:动态内存分配区

C++:new/delete运算符

  • 在堆上生成对象,需要自动调用构造函数
  • 释放时自动调用析构函数
  • new/delete配对使用
  • new[]/delete[]生成和释放对象数组
  • new/delete是运算符,malloc/free是函数调用
int * p = (int *)malloc(sizeof(int));free(p);p = NULL;

bss段

bss段存放没有初始化或者初始化为0的全局变量
(大多数操作系统在加载程序的时候会把bss全局变量清零。为了保证可移植性,最好手工初始化为0。)
$objdump -h |grep bss
在程序运行周期内,bss数据一直都在。

data段

data段存放初始化为非零的全局变量

静态成员变量在类之间共享数据,也是放在全局/静态数据区中。并且只有一份拷贝。

rodata

rodata存放常量数据
常量不一定放在rodata中,有些立即数和指令编码在一起,放在text中。
字符串常量,编译器会去掉重复的字符串,保证只有一个副本。
常量是不能修改的。
字符串会被编译器自动放到rodata中,加const关键字修饰的全局变量也放在rodata中。

存储自动变量或局部变量,以及传递的参数等。
会被自动释放。

是用户程序控制的存储区,存储动态产生的数据。

栈一般很小,满足不了程序的要求,在堆上分配的内存可以通过地址共享

参数传递const引用,不需要调用拷贝构造函数,效率比较高。

0 0