您现在的位置是:首页 >技术交流 >【C/C++】基础知识之动态申请内存空间new-delete网站首页技术交流

【C/C++】基础知识之动态申请内存空间new-delete

天喜Studio 2024-08-07 18:01:03
简介【C/C++】基础知识之动态申请内存空间new-delete

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>?<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
?c++系列专栏:C/C++零基础到精通 ?

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

在这里插入图片描述

c语言内容?:

专栏:c语言之路重点知识整合

【c语言】全部知识点总结


一、c语言动态申请内存空间

c语言堆区malloc相关知识点:【c语言】五大内存区域 | 堆区详解

使用malloc将堆区创建一个存储空间并把局部变量存放进去,该数据如果不被手动回收,就会一直存放在堆区中。

释放完后将指针p赋值为NULL,避免野指针的出现

	int* p = (int*)malloc(sizeof(int));
	//...........
	free(p);
	p = NULL;

在C++中,有一种全新的方式用来在堆区动态申请内存空间——newdelete关键字

在这里插入图片描述

二、new-delete

使用new关键字动态在堆区申请内存空间,new关键字后 放 类型,返回的是对应类型的地址!!!

格式:new关键字 后加上类型名,在堆区申请该类型空间大小的空间

代替c语言中的malloc 还不用进行强转

例如:

	int* p1 = new int;
	*p1 = 1;
	cout << *p1 << endl;

使用delete代替c语言中的free释放空间

但是delete不是函数,关键字后直接加上要释放空间的指针地址,仍然将指针p赋值为NULL:

	int* p1 = new int;
	*p1 = 1;
	cout << *p1 << endl;

	delete p1;
	p1 = NULL;

基本数据

在int类型后加(),可以赋予初始值

int* p2 = new int(7);
	cout << *p2 << endl;

	delete p2;
	p2 = NULL;

如果未指定初始值,则初始值为0:

int* p3 = new int();
	cout << *p3 << endl;

	delete p3;
	p3 = NULL;

在这里插入图片描述

数组

申请一个int型数组的堆区空间:

	int* p4 = new int[3];

同样可以赋予初始值:

	int* p4 = new int[3] {1,2,3};
	for (int i = 0; i < 3; i++)
	{
		cout << p4[i] << " ";
	}

与基本数据类型不同的是:在delete数组的时候,需要在指针前加[]用来代表数组,二维数组同样

中括号[]放在前面,代表整个数组

例如:

	delete []p4;
	p4 = NULL;

在这里插入图片描述

注:

delete回收空间并不包含指针本身,而是指针指向的内存空间,同一块内存空间不要重复释放,除非指针已经被赋空,对空指针使用delete是安全的。
对栈区的内存空间不能使用delete来释放!

三、new指针、new数组

只需要牢记:

使用new关键字动态在堆区申请内存空间,new关键字后 放 类型,返回的是对应类型的地址!!!

就两种情况

  • new指针——
  • new数组——

1.new 整型指针

整型指针对应的地址:二级指针,因此为int ** p1

	int** p1 = new int*;
	delete p1;
	p1 = NULL;

2.new 指针数组

指针数组相关知识点:【c语言】指针数组

指针数组对应的地址也是二级指针,因此为int ** p2

	int** p2 = new int* [3];
	delete []p2;
	p2 = NULL;

3.new 数组指针

数组指针相关知识点:【c语言】数组指针

数组指针int(*p3)[3]的指针 在类型上再加*int(**p3)[3]

int(**p3)[3] = new (int(*)[3]);
	delete p3;
	p3 = NULL;

4.new 整型的二维数组

指向二维数组的指针为:一维数组指针int(*p4)[3]

	int(*p4)[3] = new int[2][3];
	delete[]p4;
	p4 = NULL;

5.new 函数指针

先随便定义一个函数:

void fun(int a)
{
	cout << "TianXi Studio" << endl;
}

指向函数指针的地址:在函数指针void(*p5)(int)基础上加*void(**p5)(int)

	void(**p5)(int) = new (void (*)(int));
	delete p5;
	p5 = NULL;

总结

malloc-free和new-delete的区别

  • new、delete是关键字,需要C++的编译器支持,malloc()、free() 是函数,需要头文件支持

  • new申请空间不需要指定申请大小,根据类型自动计算,new返回的是申请类型的地址,不需要强转,malloc()需要显式的指定申请空间的大小(字节),返回void* ,需要强转成我们需要的类型。

  • new申请空间的同时可以设置初始化,而malloc 需要手动赋值

  • malloc()free() 则不会调用构造、析构函数

在这里插入图片描述


在C语言中,常用的动态申请内存空间的函数是malloc、callocrealloc,并且需要手动free释放已分配的内存空间

而在C++中,可以使用new操作符来动态创建一个对象或一段对象数组

new可以自动调用构造函数初始化对象,而delete操作符则会自动调用析构函数,释放分配的内存空间(后面会提到)

使用delete释放动态分配的对象数组时记得加上方括号,否则只会释放首个元素并不会将整个数组的内存空间都释放掉。


在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。