c++申请堆内存

14 篇文章 1 订阅
3 篇文章 0 订阅
linux平台中new内部是通过malloc实现的,new比malloc多一个调用构造函数
malloc只是返回一块荒地给你,而new会给你修好路盖好别墅规划好田地

new和malloc的区别

int main(void)
{
	// C++中用新关键字new和delete替代了malloc和free
	int *p = new int(53);	// p本身分配在栈上,p指向的是一个int类型的数,占4字节

	cout << "p = " << p << ", *p = " << *p << endl;
	delete p;			// 释放p指向的那4个字节的内存


	// a分配在heap中,指针p是指向a的,指针p自身是分配在栈上的
	int *q = (int *)malloc(4);		
	*q = 5;		// 使用p指向的那4个字节的内存(a)
	cout << "q = " << q << ", *q = " << *q << endl;
	free(p);	// 释放p指向的那4个字节的内存(a)
	
	return 0;
}

在这里插入图片描述

malloc是由C库函数,new是由C++运算符关键字
malloc返回值为void *因此需要强转,而new返回值类型为确定的对象指针类型
malloc申请空间大小靠传参确定,而new不需要传参,对象本身大小由编译器自动计算给出
malloc对应free释放,new对应delete和delete[]释放

new会执行类的构造函数而malloc不会
malloc只能申请内存不能带初始化,而new可以带初始化

malloc失败返回NULL,而new失败引发bad_alloc异常
申请和释放数组类型时不同

new、delete、malloc、free关系

delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数。malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。

delete与 delete []区别

delete只会调用一次析构函数,而delete[]会调用每一个成员的析构函数。

deletenew配套,delete []new []配套
用new分配的内存用delete删除;用new[]分配的内存用delete[]删除。delete[]会调用数组元素的析构函数。
delete[]删除一个数组,delete删除一个指针。
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

腿毛都能控

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

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

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

打赏作者

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

抵扣说明:

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

余额充值