C++ 比 C语言 增加的新特性 4 之 内存分配

news2024/11/19 15:35:18

1. 内存分配

1.1 面试题:

C语言里的malloc和free与C++里的new和delete有什么区别?

C语言:

malloc:用于动态内存分配

free:释放动态内存

C++:

new:用于动态内存的申请

delete:用于释放申请的动态内存

1)C语言中malloc和free适用于内置的数据类型,C++中的new和delete不仅适用于内置的数据类型,还适用于自定义的类型(类类型)

2)C语言中使用malloc时,需要进行强转,但C++使用new不需要强转

3)C语言中使用malloc申请空间时需要指定空间大小,但new不需要指定大小

4)C语言中的malloc是函数,而new不是函数,其实质就是一个操作符

5)C语言中的malloc申请空间时没有向空间中存放初始值,但new申请空间时可以存放初始化值

1.2 new和delete的使用:

new申请变量地址空间

格式:

数据类型(内置的数据类型和自定义的类型)   *   标识符  =   new   数据类型;

数据类型(内置的数据类型和自定义的类型)   *   标识符;

标识符  =   new   数据类型;

释放申请的空间:

格式:

delete  标识符

例如:

delete  p;

例如
int   *  p  =  new   int  ;   //在堆区new了int大小的空间,并用指针变量p指向该空间

int    * p ;
p= new int; 


People类型
People   * people = new People ;  //申请People大小的空间,并用people指向该空间

例如:
	delete  p;

1.3 new申请空间时向空间存放初始值

格式:

数据类型(内置的数据类型和自定义的类型)   *   标识符  =   new   数据类型(初始值);

数据类型(内置的数据类型和自定义的类型)   *   标识符;

标识符  =   new   数据类型(初始值);

例如:

int   *  p  =  new   int(50)  ;   //在堆区new了int大小的空间,并用指针变量p指向该空间,并且向空间中存放初始值50
	或
int    * p ;
p= new int(50); 

1.4 使用new开辟数组空间

格式:

数据类型(内置的数据类型和自定义的类型)   *   标识符  =   new   数据类型 [ 数组的大小];

数据类型(内置的数据类型和自定义的类型)   *   标识符;

标识符  =   new   数据类型[ 数组的大小];

例如:

int   *  p  =  new   int[5]  ;   //在堆区new了5个int大小的空间,并用指针变量p指向该空间
	或
int    * p ;
p= new int[50]; 

1.5 new申请数组空间时存放初始值

格式:

数据类型(内置的数据类型和自定义的类型)   *   标识符  =   new   数据类型 [ 数组的大小]{初始值1,初始值2,........};

数据类型(内置的数据类型和自定义的类型)   *   标识符;

标识符  =   new   数据类型[ 数组的大小]{初始值1,初始值2,........};

例如:

int   *  p  =  new   int[5]{1,2,3,4,5}  ;   //在堆区new了5个int大小的空间,并用指针变量p指向该空间
	或
int    * p ;
p= new int[5]{1,2,3,4,5}; 

释放空间:

格式:

delete  [] 标识符;

例如:

delete  [] p;

1.6 例

#define _CRT_SECURE_NO_WARNINGS 1

#include "iostream"
using namespace std;

//动态开辟空间
int main()
{
	//不带初始值的动态开辟
	int* p = new int;
	*p = 20;
	cout << "p=" << *p << endl;//20


	//带初始值的动态开辟
	int* q = new int(30);
	cout << "q=" << *q << endl;//30

	//动态开辟数组(不带初始化值)
	int* p1 = new int[5];
	for (int i = 0; i < 5; i++) {
		p1[i] = i + 1;
	}
	for (int i = 0; i < 5; i++) {
		cout << "数组:" << p1[i] << endl;
	}

	cout << endl;

	//动态开辟数组(带初始化值)
	int* p2 = new int[5] {1, 2, 3, 4, 5};
	for (int i = 0; i < 5;i++) {
		cout << "数组:" << p2[i] << endl;
	}
	
	//释放
	delete p;
	delete q;
	delete[]p1;//释放数组空间
	delete[]p2;

	return 0;
}

2. 动态开辟

main3.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "iostream"
using namespace std;

//动态开辟空间

int main()
{
	//不带初始值的动态开辟
	int* p = new int;
	*p = 20;
	cout << "p=" << *p << endl;//20


	//带初始值的动态开辟
	int* q = new int(30);
	cout << "q=" << *q << endl;//30

	//动态开辟数组(不带初始化值)
	int* p1 = new int[5] {1, 2, 3, 4, 5};
	for (int i = 0; i < 5; i++) {
		p1[i] = i + 1;
	}
	for (int i = 0; i < 5; i++) {
		cout << "数组:" << p1[i] << endl;
	}

	cout << endl;

	//动态开辟数组(带初始化值)
	int* p2 = new int[5] {1, 2, 3, 4, 5};
	for (int i = 0; i < 5;i++) {
		cout << "数组:" << p2[i] << endl;
	}
	
	//释放
	delete p;
	delete q;
	delete[]p1;//释放数组空间
	delete[]p2;

	return 0;
}

3. C++里的作用域:

(1)局部作用域

数据存在于代码块内部的区域,称之为“局部作用域”,数据在当前代码块中有效,超出代码块的区域就失效

(2)全局作用域

数据存在于文件中即代码块的外部,称之为“全局作用域”,数据对于整个文件都是有效的

(3)命名空间作用域

是全局作用域的一部分,数据存在于命名空间中只对该空间有效,超出则无效

(4)类作用域

是全局作用域的一部分,数据存在于类中,只读该类是有效,超出则失效


 

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

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

相关文章

python爬虫进阶-每日一学(GIF验证码识别)

目的 学习更多的python反爬虫策略 测试网址 http://credit.customs.gov.cn/ccppserver/verifyCode/creator分析 01 下载gif图片 02 使用ddddocr逐帧识别 03 如指定字符串出现次数大于等于3&#xff0c;则认定为正确的识别结果 经验证&#xff0c;识别成功率95%源码 #!/usr…

如何对Sentinel-2进行 预处理

下载Sentinel-2数据后&#xff0c;可以自动对L1C数据进行预处理&#xff0c;它用于 Sentinel-2 Level 2A 产品生成和格式化的处理&#xff1b;它对大气层 1C 级输入数据进行大气、地形和卷云校正。Sen2Cor 创建大气层底部、可选的地形和卷云校正反射率图像&#xff1b;此外&…

IDEA相关操作

目录 连接MySQL IDEA配置Maven 配置全局Maven 导入Maven项目 方法一 方法二 安装Mybatisx插件 连接MySQL 填写user和Password之后测试连接 如果是第一次连接需要联网下载数据库连接驱动&#xff0c;安装提示下载即可 如果显示如下错误需要更改时区 Server returns …

Es三节点+vip集群搭建部署方案

线上环境Es三节点集群搭建部署方案 1. 目标 Es 集群架构图 ! 2. 搭建步骤 官网教程&#xff1a; https://elasticsearch.bookhub.tech/set_up_elasticsearch/installing_elasticsearch/ 确定 Es 安装目录 机器名内网IPEs 版本重点目录es-node01192.18.233.2407.15.1安装…

在k8s中使用cert-manager部署gitlab集群

写在前面的话&#xff1a;前面有详细的分享过在k8s集群中部署gitlab&#xff0c;不过当时使用gitlab的访问证书是阿里云上免费的ssl证书&#xff0c;今天特意专门介绍下另外一种基于cert-manager发布自签证书的方式实现部署gitlab到k8s集群中。 往期gitlab部署系列如&#xff1…

什么是数据可视化?数据可视化的流程与步骤

前言 数据可视化将大大小小的数据集转化为更容易被人脑理解和处理的视觉效果。可视化在我们的日常生活中非常普遍&#xff0c;但它们通常以众所周知的图表和图形的形式出现。正确的数据可视化以有意义和直观的方式为复杂的数据集提供关键的见解。 数据可视化定义 数据可视化…

扫描全能王启动鸿蒙原生应用开发,系HarmonyOS NEXT智能扫描领域首批

近期&#xff0c;“鸿蒙合作签约暨扫描全能王鸿蒙原生应用开发启动仪式”&#xff08;简称“签约仪式”&#xff09;正式举行。合合信息与华为达成鸿蒙合作&#xff0c;旗下扫描全能王将基于HarmonyOS NEXT正式启动鸿蒙原生应用开发。据悉&#xff0c;扫描全能王是鸿蒙在智能扫…

【论文笔记】Run, Don’t Walk: Chasing Higher FLOPS for Faster Neural Networks

论文地址&#xff1a;Run, Dont Walk: Chasing Higher FLOPS for Faster Neural Networks 代码地址&#xff1a;https://github.com/jierunchen/fasternet 该论文主要提出了PConv&#xff0c;通过优化FLOPS提出了快速推理模型FasterNet。 在设计神经网络结构的时候&#xff…

Y9000P + ubuntu22.04 配置Anaconda+pycharm +pytorch

Anaconda3 的安装及使用方法安装 Anaconda3 Anaconda3 是 Anaconda 的具体版本 Anaconda3 中的 Python 解释器默认使用的是 Python3.x 版本&#xff0c;而不是 Python2.x 版本 Python2.x 版本中&#xff0c;字符串是以 ASCII 编码处理的&#xff0c;而在 Python3.x 版本中&am…

基于gradio快速部署自己的深度学习模型(目标检测、图像分类、语义分割模型)

gradio是一款基于python的算法快速部署工具&#xff0c;本博文主要介绍使用gradio部署目标检测、图像分类、语义分割模型的部署。相比于flask&#xff0c;使用gradio不需要自己构造前端代码&#xff0c;只需要将后端接口写好即可。此外&#xff0c;基于gradio实现的项目&#x…

浅谈数据仓库运营

一、背景 企业每天都会产生大量的数据&#xff0c;随着时间增长&#xff0c;数据会呈现几何增长&#xff0c;尤其在系统基建基础好的公司。好的数据仓库需要提前规划和好的运营&#xff0c;才能支持企业的发展&#xff0c;为企业提供数据分析基础。 二、目标 提高数据仓库存储…

排序算法讲解

1&#xff09;排序思想&#xff1a; 2&#xff09;排序代码&#xff1a; 3&#xff09;注意点&#xff1a; 4&#xff09;时间/空间复杂度和稳定性 下面的排序是以实现升序讲解的。 &#xff08;一&#xff09;直接插入排序 1&#xff09;排序思想&#xff1a; 把待排序的…

[Angular] 笔记 10:服务与依赖注入

什么是 Services & Dependency Injection? chatgpt 回答&#xff1a; 在 Angular 中&#xff0c;Services 是用来提供特定功能或执行特定任务的可重用代码块。它们可以用于处理数据、执行 HTTP 请求、管理应用程序状态等。Dependency Injection&#xff08;依赖注入&#…

竞赛保研 基于人工智能的图像分类算法研究与实现 - 深度学习卷积神经网络图像分类

文章目录 0 简介1 常用的分类网络介绍1.1 CNN1.2 VGG1.3 GoogleNet 2 图像分类部分代码实现2.1 环境依赖2.2 需要导入的包2.3 参数设置(路径&#xff0c;图像尺寸&#xff0c;数据集分割比例)2.4 从preprocessedFolder读取图片并返回numpy格式(便于在神经网络中训练)2.5 数据预…

002、使用 Cargo 创建新项目,打印 Hello World

1. Cargo 简介 Cargo 是 Rust 的构建系统和包管理工具&#xff0c;比如构建代码、下载依赖的库、构建这些库等等。在安装 Rust 时&#xff0c;Cargo也会一起安装。 2. 创建新项目的具体步骤 步骤1&#xff1a; 我们在桌面新建一个文件夹&#xff0c;用于存放后面练习用的代码文…

如何让机器人具备实时、多模态的触觉感知能力?

人类能够直观地感知和理解复杂的触觉信息&#xff0c;是因为分布在指尖皮肤的皮肤感受器同时接收到不同的触觉刺激&#xff0c;并将触觉信号立即传输到大脑。尽管许多研究小组试图模仿人类皮肤的结构和功能&#xff0c;但在一个系统内实现类似人类的触觉感知过程仍然是一个挑战…

【计算机网络】快速做题向 极限数据传输率的计算(有噪声/无噪声)

首先需要理解什么是码元 码元在课本上的概念比较难理解 但是只要记住 二进制码元在图上显示的就是有两种高度的横杠“—”&#xff08;对应0&#xff0c;1&#xff09;&#xff0c;即&#xff0c;有两种二进制码元 四进制就是有四种高度的横杠“—”&#xff08;对应00&…

与擎创科技共建一体化“数智”运维体系,实现数字化转型

小窗滴滴小编获取最新版公司简介 前言&#xff1a; 哈喽大家好&#xff0c;最近分享的互联网IT热讯大家都挺喜欢&#xff0c;小编看着数据着实开心&#xff0c;感谢大家支持&#xff0c;小编会继续给大家推送。 新岁即将启封&#xff0c;我们一年一期的运维干货年末大讲也要…

【C++】开源:fast-cpp-csv-parser数据解析库配置使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍fast-cpp-csv-parser数据解析库配置使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一…

小程序面试题 | 22.精选小程序面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…