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

news2024/11/29 2:33:54

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

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

在这里插入图片描述

c语言内容💖:

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

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


目录

  • 一、c语言动态申请内存空间
  • 二、new-delete
    • 基本数据
    • 数组
  • 三、new指针、new数组
    • 1.new 整型指针
    • 2.new 指针数组
    • 3.new 数组指针
    • 4.new 整型的二维数组
    • 5.new 函数指针
  • 总结
    • malloc-free和new-delete的区别

一、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释放动态分配的对象数组时记得加上方括号,否则只会释放首个元素并不会将整个数组的内存空间都释放掉。


在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/607203.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

对Java远程热部署实践学习和分析

目录 一、热部署现状和必要性分析 &#xff08;一&#xff09;热部署定义和现状分析 &#xff08;二&#xff09;技术实现难度分析 &#xff08;三&#xff09;其必要性分析 二、走进美团Java远程热部署实践 &#xff08;一&#xff09;Sonic分析 &#xff08;二&#x…

Delphi11的多线程ⓞ,附送图片处理代码

Delphi11的多线程ⓞ OLD Coder , 习惯使用Pascal 接下来准备启用多线程&#xff0c;毕竟硬件多核&#xff0c;Timer不太爽了&#xff08;曾经的桌面&#xff0c;都是Timer——理解为“片”&#xff09; 突然想写写&#xff0c;不知道还有多少D兄弟们在。 从源码开始 用D11之…

第1节:vue cesium 概述(含网站地址+视频)

在开始介绍vue cesium之前&#xff0c;我们先聊聊cesiumjs&#xff0c;如果你对这块内容比较熟悉&#xff0c;可以直接跳过这节内容。 cesiumJS 简介 官方网址&#xff1a;https://cesium.com/platform/cesiumjs/ CesiumJS 是一个开源 JavaScript 库&#xff0c;主要用于基于…

Linux之理解文件系统——文件的管理

文章目录 前言一、磁盘1.磁盘的物理结构2.磁盘的存储结构3.磁盘的逻辑结构 二、文件系统与inode1.文件在磁盘中是如何存储的&#xff1f;2.对文件进行操作 三、软硬链接1.软链接创建软链接&#xff1a;inode删除软链接&#xff1a;软链接的作用&#xff1a; 2.硬链接创建硬链接…

chatgpt赋能python:Python另存为对话框:如何在Python中创建一个另存为对话框

Python 另存为对话框&#xff1a;如何在Python中创建一个另存为对话框 如果你是一名 Python 开发者&#xff0c;你可能会常常需要为你的应用程序添加一个另存为对话框。这个对话框使用户可以将他们的数据保存为一个新的文件&#xff0c;而不是覆盖原始文件。然而&#xff0c;很…

【JavaEE】Tomcat-Servelet第一个helloworld程序

Tomcat & Servelet第一个程序helloworld&#xff01; 文章目录 JavaEE & Tomcat & 第一个Servelet程序1. HTTP服务器 - Tomcat1.1 Tomcat的目录结构&#xff1a;1.2 启动Tomcat1.3 Tomcat的优点 2. Servelet框架2.1 创建Maven项目2.2 引入依赖2.3 创建目录2.4 写代…

【Java】wait和notify方法

wait方法wait()和join()的区别wait()和sleep()的区别notify()和notifyAll()实例 wait()和notify()方法都是Object类中的方法。由于每个类都会继承Object类&#xff0c;所以每个对象中都会包含这些方法。 wait方法 wait() 是让线程等待一段时间&#xff0c;死等。对应到线程的…

Linux账号管理与ACL权限设定(一)

Linux的账号与群组 Linux系统中&#xff0c;关于账号和群组&#xff0c;实际记录的是UID和GID的数字&#xff1b; 关于账号有两个非常重要的文件&#xff1a;/etc/passwd 和 /etc/shadow &#xff1b; /etc/passwd 文件结构&#xff1a; 账号名称&#xff1a;密码&#xff…

chatgpt赋能python:Python中另起一行输出的方法

Python中另起一行输出的方法 在Python编程中&#xff0c;我们需要经常输出内容到控制台或者文件中。而有时候&#xff0c;我们可能需要将输出的内容另起一行来符合排版或格式要求。这篇文章将介绍Python中另起一行输出的方法。 使用print函数 Python中最简单的输出方法就是使…

阵列信号处理笔记(1):预备知识、阵列流形、波数-频率响应

阵列信号处理笔记&#xff08;1&#xff09; 文章目录 阵列信号处理笔记&#xff08;1&#xff09;预备知识从延时到阵列流形矢量频率波数响应 预备知识 如图所示的球坐标系中&#xff0c;任意一阵元的位置可以用 ( r , ϕ , θ ) (r,\phi,\theta) (r,ϕ,θ)唯一表示&#xff…

前端045_单点登录SSO_实现流程

单点登录SSO_实现流程 1、背景2、基于同域下 Cookie 实现 SSO1、背景 在企业发展初期,企业使用的系统很少,通常一个或者两个,每个系统都有自己的登录模块,运营人员每天用自己的账号登录,很方便。 但随着企业的发展,用到的系统随之增多,运营人员在操作不同的系统时,需要…

Linux命令(28)之locate

Linux命令之locate 1.locate介绍 linux命令locate用于查找文件所在位置&#xff0c;与which、whereis命令类似&#xff0c;locate命令将会在预先建立好的档案数据库中查询文件。 locate档案数据库路径&#xff1a;/var/lib/mlocate locate档案数据库名称&#xff1a;mlocat…

SpringBoot之Transactional事务

目录 一、事务管理方式二、事务提交方式三、事务隔离级别四、事务传播行为1、Propagation.REQUIRED2、Propagation.SUPPORTS3、Propagation.MANDATORY4、Propagation.REQUIRES_NEW5、Propagation.NOT_SUPPORTED6、Propagation.NEVER7、Propagation.NESTED 五、事务回滚六、只读…

前后端分离项目之登录页面(前后端请求、响应和连接数据库)

目录 一、前端登录发起请求 二、后端请求接收 三、连接数据库 四、后端响应 五、前端处理 六、在前端验证用户是否登录 七、web会话跟踪 八、请求拦截器和响应拦截器 本文Vue-cli前端项目基于文章&#xff1a; Vue-cli搭建项目(包含Node.js安装和ElementUI安装)_小俱的…

2. requests.get()函数访问网页(小白入门)

2. requests.get()函数访问网页(小白入门) 文章目录 2. requests.get()函数访问网页(小白入门)1. 人工访问网页2. 爬虫第一步&#xff1a;发起网络请求3. requests库的安装4. requests.get()函数&#xff1a;发送网络请求5. 代码解析1. 导入库的语法2. 指定网址3. 发送请求4. 输…

chatgpt赋能python:Python取消撤销——让你的代码更加高效

Python取消撤销——让你的代码更加高效 在Python编程的过程中&#xff0c;经常会出现需要撤销操作的场景。但是&#xff0c;在一些复杂的代码编辑器中&#xff0c;常规的CtrlZ撤销操作可能无法满足你对代码精度的要求。为此&#xff0c;Python取消撤销就应运而生。 Python取消…

多变量系统的最小二乘辨识问题的推导以及matlab仿真

1.单输入单输出情况的推导;2.两输入两输出情况的推导,并进行matlab仿真以及完成仿真报告。 多变量系统的最小二乘辨识问题是确定一个线性多输入多输出(MIMO)系统的未知参数,使得该系统能够以最佳方式近似给定输入和输出之间的关系。在本例中,我们将展示单输入单输出(SIS…

软件外包开发的测试用例

软件测试用例是一组详细的步骤、输入数据、预期结果和实际结果&#xff0c;用于验证软件是否满足特定需求或功能。编写测试用例的目的是确保软件的质量和性能。今天和大家分享编写软件测试用例的一般步骤&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;…

解决record on line 2: wrong number of fields

背景 基于"encoding/csv"库解析。 共解析多个文档&#xff0c;只有这一个解析有问题&#xff0c;所用代码一致&#xff0c;进行比较后 发现该文档和其它文档不同&#xff0c;其它文档是第一行就是列名&#xff0c;下面都是数据&#xff1b; 而这个文档前两行有数据且…

k8s部署Elasticsearch集群+Kibana方案--开启X-Pack 安全认证

前言 本文中使用StatefulSet 方式部署 Elasticsearch 集群&#xff0c;并且开启X-Pack 安全认证&#xff0c;存储使用的是NFS&#xff0c;属于一个初学者自己探索的方案&#xff0c;如果有比较好的方案&#xff0c;还请不吝评论赐教。 版本说明&#xff1a; Kubernetes v1.25…