C++ | 关键字new 与 delete ——动态申请空间

new 与 delete 运算符在C++中用于动态分配内存。而在C语言中C库函数malloc 与 free 也可以用作动态分配内存。

malloc 与 free 使用实例:
void *malloc(size_t size)

	/* malloc 与 free 使用 */
	int* p = (int*)malloc(sizeof(int));
	if (nullptr == p)
	{
		cerr << "malloc error" << endl;
		return -1;
	}
	*p = 20;	// 赋值
	free(p);	// 销毁

new 与 delete 使用实例:

	/* new 与 delete 使用 */
	int* q = new int(20);	// 申请+赋值
	delete q;

	/* 异常判断 通过捕获异常*/
	try 
	{
		int* q1 = new int(20);	// 申请失败默认抛出异常
		// ..
		delete q1;
	} 
	catch (const bad_alloc & e)
	{
		cerr << e.what() << endl;
		return -1;
	}

	/* 异常判断 通过判断返回值*/
	int* q2 = new(std::nothrow) int(20);	// 不抛出异常
	if (nullptr == q2)
	{
		cerr << "new error" << endl;
		return -1;
	}
	delete q2;
1. 区别与联系
  1. new 可以在开辟内存的同时做初始化;malloc只能先开辟空间 后初始化。
  2. new 开辟内存失败,默认是通过抛出bad_allocd类型的异常来判断; malloc开辟内存失败,通过返回值等于nullptr做判断。
  3. new 申请的数组在使用delete释放时,使用 delete[] parr; 语法;malloc申请的空间,使用 free(p); 的方式释放。

注:free

Free函数释放以前通过调用calloc、 malloc或realloc分配的内存块(memblock)。 释放的字节数等于分配块时请求的字节数(如果realloc,则为重新分配的字节数)。 如果memblock为NULL,则将忽略指针,并且立即返回free 。 尝试释放无效指针(指向不是由calloc、 malloc或realloc分配的内存块的指针)可能会影响后续分配请求并导致错误。

注:delete

在指向未分配new的对象的指针上使用delete会产生不可预测的结果。但是,您可以在值为0的指针上使用delete。这一规定意味着,当new失败时返回0,删除失败的new操作的结果是无害的。

  • free 与 delete 都可以对NULL指针使用,同时不会产生任何效果。
  • free 与 delete 使用之后不会改变指针的指向,一般在使用之后手动将指针置空。

2. new有多少种

	int* p1 = new int(10);				// 普通的new操作:默认抛出异常

	int* p2 = new(nothrow) int(20);		// 不抛出异常的new操作

	const int* p3 = new const int(30);	// 在堆区申请常量内存

	// 定位new : 在指定位置申请空间
	int data = 0;
	int* p4 = new(&data) int(40);		// 在 (&data) 上申请空间,初始为40

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

我叫RT

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

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

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

打赏作者

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

抵扣说明:

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

余额充值