【C++】动态内存管理 ② ( new 运算符 为 基础数据类型 / 基础数据数组类型 分配堆内存 )

2023-09-20 20:58:59





一、C++ 对象的动态创建和释放



动态内存管理 在 C++ 语言中 , 就是通过 new 和 delete 运算符 进行对象的 创建 与 释放 ;

  • 通过 new 运算符 创建对象 , new 运算符 相当于 C 语言中的 malloc / calloc / realloc 等 申请内存的 标准库函数 ;
  • 通过 delete 运算符 释放对象 , delete 运算符 相当于 C 语言中的 free 释放内存的 标准库函数 ;

在 C++ 语言中 , 为了兼容 C 语言 , 仍然可以使用 malloc 和 free 函数动态管理内存 ,

但是 更建议 开发者在 C++ 程序开发时 , 使用 new 和 delete 运算符 进行 动态内存的管理 ;

不建议在 C++ 中使用 malloc 和 free 进行动态内存管理 ;


使用 new 和 delete 运算符 可以为如下类型的变量 动态分配内存 :

  • 类对象
  • 基础类型
  • 数组类型




二、new 运算符 为 基础数据类型 / 基础数据数组类型 分配堆内存




1、语法说明


new 运算符 分配堆内存 语法 : new 运算符 作用是 在 堆内存中 为某个类型分配 内存空间 ;

指针类型变量 = new 类型 ( 常量 )	// 创建 类 / 普通类型 变量
指针类型变量 = new 类型 			// 创建 类 / 普通类型 变量 , 省略 常量
指针类型变量 = new 类型 [ 数字 ]	// 创建数组 , 中括号中是 数组元素个数
  • 小括号 中的 常量值 是可以省略的 ;
  • 中括号 表示的是为 数组类型 分配内存空间 , 中括号内是 数组元素个数 ;

2、语法简单示例


new 运算符 使用示例 :

  • 创建 普通类型 变量 : 堆内存 中 创建 int 类型 存储空间 , 返回 指向该内存空间 的 指针 ( 空间地址 ) ;
int* ptr = new int;
  • 创建 普通类型 变量 并设置初始值 : 堆内存 中 创建 int 类型 存储空间 , 并为其设置初始值 9527 , 返回 指向该内存空间 的 指针 ( 空间地址 ) ;
int* ptr = new int(9527);
  • 创建 普通数组类型 变量 : 堆内存 中 创建 int 数组类型 存储空间 , 返回 指向该内存空间 的 指针 ( 空间地址 ) , 中括号中是 数组元素个数 ;
int* ptr = new int[8];
  • 创建 普通二维数组类型 变量 : 堆内存 中 创建 int 二维数组类型 存储空间 , 返回 指向该内存空间 的 指针 ( 空间地址 ) , 中括号中是 数组元素个数 ;
int* ptr = new int[4][8];

3、代码示例 - 基础类型内存分配


在 C 语言中使用 malloc 函数 动态申请堆内存 , 使用 free 函数 释放内存 ;

在 C++ 语言中 , 使用 new 基础数据类型 申请内存 ,

int* p2 = new int;

使用 delete(指针变量) 释放内存 ;

delete(p2);

代码示例 :

	// I. 基础类型内存分配
	
	// C 语言中动态申请内存
	int* p = (int*)malloc(sizeof(int));
	*p = 10;

	// C++ 语言中动态申请内存
	int* p2 = new int;
	*p2 = 20;

	cout << "*p = " << *p << " , *p2 = " << *p2 << endl;

	// C 语言中 释放内存 与 malloc 相对应
	free(p);

	// C++ 语言中 释放内存 与 new 相对应
	delete(p2);

4、代码示例 - 基础数组类型内存分配


在 C 语言中使用 malloc 函数 动态申请堆内存 , 使用 free 函数 释放内存 ;

在 C++ 语言中 , 使用 new 基础数据类型[数组元素个数] 申请内存 ,

int* array2 = new int[2];

使用 delete(指针变量) 释放内存 ;

delete(array2);

代码示例 :

	// II. 数组类型内存分配

	// C 语言中动态申请内存
	int *array = (int*)malloc(sizeof(int) * 2);
	array[0] = 9527;
	array[1] = 3859;

	// C++ 语言中动态申请内存
	int* array2 = new int[2];
	array2[0] = 1234;
	array2[1] = 5678;

	cout << "array[0] = " << array[0] << " , array2[0] = " << array2[0] << endl;

	// C 语言中 释放内存 与 malloc 相对应
	free(array);

	// C++ 语言中 释放内存 与 new 相对应
	delete(array2);




三、完整代码示例 - new 运算符 为 基础数据类型 / 基础数据数组类型 分配堆内存



代码示例 :

#include "iostream"
using namespace std;

int main()
{
	// I. 基础类型内存分配
	
	// C 语言中动态申请内存
	int* p = (int*)malloc(sizeof(int));
	*p = 10;

	// C++ 语言中动态申请内存
	int* p2 = new int;
	*p2 = 20;

	cout << "*p = " << *p << " , *p2 = " << *p2 << endl;

	// C 语言中 释放内存 与 malloc 相对应
	free(p);

	// C++ 语言中 释放内存 与 new 相对应
	delete(p2);

	// II. 数组类型内存分配

	// C 语言中动态申请内存
	int *array = (int*)malloc(sizeof(int) * 2);
	array[0] = 9527;
	array[1] = 3859;

	// C++ 语言中动态申请内存
	int* array2 = new int[2];
	array2[0] = 1234;
	array2[1] = 5678;

	cout << "array[0] = " << array[0] << " , array2[0] = " << array2[0] << endl;

	// C 语言中 释放内存 与 malloc 相对应
	free(array);

	// C++ 语言中 释放内存 与 new 相对应
	delete(array2);

	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
	return 0;
}

执行结果 :

*p = 10 , *p2 = 20
array[0] = 9527 , array2[0] = 1234
Press any key to continue . . .

在这里插入图片描述

更多推荐

【送书活动】网络安全(黑客)自学

前言「作者主页」:雪碧有白泡泡「个人网站」:雪碧的个人网站「推荐专栏」:★java一站式服务★★React从入门到精通★★前端炫酷代码分享★★从0到英雄,vue成神之路★★uniapp-从构建到提升★★从0到英雄,vue成神之路★★解决算法,一个专栏就够了★★架构咱们从0说★★数据流通的精妙之道★★后端进阶之路★文章目

以太网媒体接口MII/RMII/SMII/GMII/RGMII/SGMII

以太网媒体接口MII/RMII/SMII/GMII/RGMII/SGMIIGMAC系统框架(EMAC是百兆mac,GMAC是千兆mac)网卡网卡系统框架结构PHY(PhysicalLayer,物理层)MAC(MediaAccessControl、媒体访问控制器)以太网结构大框架MAC硬件框图MII(MediaIndep

使用cpolar配合Plex搭建私人媒体站

文章目录1.前言2.Plex网站搭建2.1Plex下载和安装2.2Plex网页测试2.3cpolar的安装和注册3.本地网页发布3.1Cpolar云端设置3.2Cpolar本地设置4.公网访问测试5.结语1.前言用手机或者平板电脑看视频,已经算是生活中稀松平常的场景了,特别是各种碎片时间(追剧下饭、地铁上刷剧等等),看

设计模式:单例模式

目录什么是单例模式为什么使用单例模式常见的单例写法1.懒汉式(LazyInitialization)2.双重检查锁定(Double-CheckedLocking)3.饿汉式(EagerInitialization)4.枚举实现单例总结什么是单例模式单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供全局访问点来

Docker Compose

DockerCompose是一个用于定义和运行多容器Docker应用程序的工具。它使用一个YAML文件来配置应用程序的服务、网络和存储等方面,并使用简单的命令来管理应用程序的生命周期。使用DockerCompose,你可以将多个容器(即服务)组合在一起,形成一个完整的应用程序。每个服务都可以由一个或多个容器组成,并且可

Redis分布式锁及其常见问题解决方案

Redis是一种内存中的数据结构存储系统,它可以用作数据库、缓存和消息代理。由于其高性能和灵活的数据结构,Redis被广泛应用在各种场景中,包括实现分布式锁。分布式锁是一种在分布式系统中实现互斥访问的技术。在许多实际应用场景中,我们需要确保某些操作在同一时间只能被一个节点执行,例如更新共享资源、处理任务队列等。这时,我

【线性代数】沉浸式线性代数在线学习网站

地址:http://immersivemath.com/ila/index.html这是全球第一本带交互式图形的线性代数教材,作者是J.Ström,K.Åström,andT.Akenine-Möller。全书一共十章,各章节内容如下:接下来我将对各章节进行简单的总结,另外请注意,阅读过程中请一定不要忘记各章节提供的的

好物周刊#7:炫酷的浏览器标签页

村雨遥的好物周刊,记录每周看到的有价值的信息,主要针对计算机领域,每周五发布。一、项目1.Qexo一个快速、强大、漂亮的在线Hexo编辑器,支持以下功能:自定义图床上传图片在线配置编辑在线页面管理开放API自动检查更新在线一键更新快速接入友情链接简单的说说短文类似不算子的统计自动填文章模板2.Twikoo一个简洁、安全

【云原生】k8s集群调度

目录一、调度约束1.1List-Watch工作机制1.2调度过程二、指定调度节点2.1修改成nodeSelector调度方式三、亲和性(1)节点亲和性(2)Pod亲和性3.1键值运算关系四、污点(Taint)和容忍(Tolerations)4.1污点(Taint)4.2容忍(Tolerations)4.3其它注意事项五

【使用Cpolar将Tomcat网页传输到公共互联网上】

文章目录1.前言2.本地Tomcat网页搭建2.1Tomcat安装2.2配置环境变量2.3环境配置2.4Tomcat运行测试2.5Cpolar安装和注册3.本地网页发布3.1.Cpolar云端设置3.2Cpolar本地设置4.公网访问测试5.结语1.前言Tomcat作为一个轻量级的服务器,不仅名字很有趣(让人想起童年)

小程序引入vant-Weapp保姆级教程及安装过程的问题解决

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。本文同时参与「掘力星计划」,赢取创作大礼包,挑战创作激励金当你想在小程序里引入vant时,第一步:打开官方文档,第二步:切到快速上手,然后开始步骤一、步骤二、步骤三?你只会看到--------------------------以下是正文------------

热文推荐