C++中malloc、free函数和new、delete运算符

本文深入探讨C++中内存的四种区域:代码区、全局区、堆区和栈区,并详细解析malloc、free、new、delete等内存管理函数的使用方法及注意事项,包括野指针的避免和内存分配失败的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++内存结构从低地址到高地址依次可分为:代码区(只读区) - 全局区(静态区) - 堆区 - 栈区。代码区存放编译后的二进制代码;全局区存放程序执行时的全局变量和静态数据;堆区用于存放程序执行时动态分配的内存段;栈区当前执行函数的信息。
程序执行内存分配的三种方式(编译代码不分配内存,只是一个难搞的翻译过程而已,执行的时候才分配):

这篇文章对malloc、free和new、delete解释的特别详细,层次也很深:https://www.cnblogs.com/gaochaooo/archive/2009/09/03/1559764.html,如果对这部分内容不是很熟,建议先看一下下面内容,学会基本的语法,再去看这篇博客会事半功倍。

malloc、free函数

分别用于分配、释放内存,操作的是堆内存

malloc、free 使用步骤:申请内存 -> 确认是否申请成功 -> … -> 释放内存 -> 置空指针

为什么置空呢?我们在删除一个指针之后,编译器只会释放该指针所指向的内存空间,而不会删除这个指针本身,如果不置空,就会出现野指针。所以在删除一个指针之后,一定将该指针设置成空指针。如果不明白可以看这里:https://blog.csdn.net/qq_36570733/article/details/80043321

int* array = (int*)malloc(10 * sizeof(int));//申请内存
assert(array != NULL);//使用断言判断是否申请成功

for (int i = 0; i < 10; i++)
	*(array + i) = i;
for (int i = 0; i < 10; i++)
	std::cout << *(array + i) << std::endl;
free(array);//释放内存,释放完array并不为null
array = NULL;//置空指针
new、delete运算符

分别用于分配、释放内存,操作的是堆内存

  • new / new[]:完成两件事,先底层调用 malloc 分配了内存,然后调用构造函数(创建对象)。
  • delete/delete[]:也完成两件事,先调用析构函数(清理资源),然后底层调用 free 释放空间。
  • new 在申请内存时会自动计算所需字节数,而 malloc 则需我们自己输入申请内存空间的字节数。

使用的基本步骤同malloc、free一样:

int* pa = new int;
assert(pa != NULL);
*pa = 110;
std::cout << *pa << std::endl;

int* pb = new int(111);
assert(pb != NULL);
std::cout << *pb << std::endl;

int* array = new int[10];
assert(array != NULL);
for (int i = 0; i < 10; i++)
	*(array + i) = i;
for (int i = 0; i < 10; i++)
	std::cout << *(array + i) << std::endl;

delete pa;
pa = NULL;
delete pb;
pb = NULL;
delete[] array;
array = NULL;
new/delete与malloc/free总结
特征new/deletemalloc/free
分配内存位置自由存储区
分配成功返回值类型指针void*(需要指针类型强制转换)
分配失败返回值默认抛出bac_alloc异常返回NULL
分配内存大小编译器根据类型计算必须显示指定字节数
处理数组new[]计算字节数显示指定
已分配内存的扩充无法直观地处理使用realloc函数
是否相互调用可以,看具体的operator new/delete实现不可调用new
分配内存时内存不足用户能指定处理函数或重新指定分配器无法通过用户代码进行处理
函数重载允许不允许
构造函数与析构函数调用不调用
delete this 合法吗?

https://isocpp.org/wiki/faq/freestore-mgmt#delete-this

合法,但:

  • 必须保证 this 对象是通过 new(不是 new[]、不是 placement new、不是栈上、不是全局、不是其他对象成员)分配的
  • 必须保证调用 delete this 的成员函数是最后一个调用 this 的成员函数
  • 必须保证成员函数的 delete this 后面没有调用 this 了
  • 必须保证 delete this 后没有人使用了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yelvens

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值