malloc/free和new/delete

C/C++内存管理:malloc/free与new/delete对比解析
本文详细介绍了C语言中的malloc和free以及C++中的new和delete在内存管理上的使用和区别。malloc/free是函数,new/delete是运算符,malloc失败返回空指针,new失败则抛出异常。此外,C++中new和delete有对应的数组操作形式,而malloc/free没有区分。在实际开发中,理解这些差异对避免内存泄漏和程序崩溃至关重要。


前言

在C语言中,通过malloc申请堆内存,free释放堆内存。在C++中,也可以通过C语言的方式申请堆内存并释放堆内存,还可以通过new申请堆内存delete释放堆内存。


一、malloc和free

	int* p = (int*)malloc(sizeof(int));
	free(p);

通过malloc申请堆内存需要传入内存的大小(单位为字节)
通过free释放内存需要传入指向堆内存的指针

二、new和delete

申请单个元素内存:

int* p1 = new int;
delete p1;

申请内存数组:

int* p1 = new int[4];
delete[] p1;

对于C语言来说,没有内存数组之分,单个元素内存和内存数组都可以通过malloc申请,free释放
对于C++来说,申请单个元素内存需要通过new '类型’申请,通过delete释放,申请内存数组需要通过new ‘类型’[‘元素个数’]申请,通过delete[]释放

二、malloc/free和new/delete的区别

1、malloc/free是函数,new/delete是运算符
2、malloc申请堆内存失败会返回一个空指针,new申请堆内存失败会抛出bad_alloc异常

malloc返回空指针:

	int* p = (int*)malloc(sizeof(int));
	if (p == nullptr)
	{
		cout << "申请内存失败" << endl;
		return -1;
	}
	free(p);

new抛出bad_alloc异常:

	int* p1 = nullptr;
	try
	{
		p1 = new int[4];
	}
	catch (const bad_alloc& e)
	{
		cout << "申请内存失败" << endl;
		return -1;
	}
	delete[] p1;

3、malloc和free成对使用,new和delete成对使用,new[]和delete[]成对使用


总结

new/delete是运算符,在C++中,运算符是可以重载的。如果你需要用自己的一套策略去管理堆内存,可以考虑重载new/delete的运算符,实现对象池。malloc申请堆内存失败返回空指针,new申请堆内存失败抛出bad_alloc异常,在实际开发中需要注意下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值