动态内存分配

本文详细介绍了C语言中的malloc/free函数与C++中的new/delete运算符在内存管理中的应用,包括它们如何分配和释放堆内存。同时,还探讨了不同内存区域如data、code、stack和heap的作用及特点,并解释了bss段、data段和rodata段的具体用途。

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引用,不需要调用拷贝构造函数,效率比较高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值