在C++中,用“new”自定义动态数组

C++中new[…]和动态数组 阅读详情
AI摘要

本文深入探讨了C++中使用new关键字动态开辟数组空间的方法,包括一维与二维动态数组的创建与释放,以及new运算符的底层机制。通过实例代码,详细讲解了如何避免常见错误,实现内存的有效管理和利用。

概述:

  1. 本文主要讲述了C++中的关键词“new”,在开辟动态数组空间时的使用方式。
  2. 仅仅讲述new的语法使用规则,不讲述其底层的实现机制。
  3. 仔细阅读本篇文章,你将会了解如何用“new”关键词,动态地开辟数组空间,实现动态数组。
  4. C语言中的动态数组,请参考这篇:https://blog.youkuaiyun.com/ComputerGeekHack/article/details/102999204

 

new的简要说明

new是C++程序设计语言中的一种语言结构,用于动态分配内存、并用构造函数初始化分配的内存。

new的使用称为“new运算符表达式”,其内部实现分为两步:

  1. 调用相应的operator new()函数,动态分配内存。如果operator new()不能成功获得内存,则调用new_handler函数。如果没有设置new_handler函数或者new_handler未能分配足够内存,则抛出std::bad_alloc异常。“new运算符表达式”所调用的operator new()函数,按照C++的名字查找规则,首先做依赖于实参的名字查找(即ADL规则),在要申请内存的数据类型T的内部、数据类型T定义处的名字空间查找;如果没有查找到,则直接调用全局的::operator new()函数。
  2. 在分配到的动态内存块上初始化相应类型的对象并返回其首地址。如果调用构造函数初始化对象时抛出异常,则自动调用operator delete()函数释放已经分配到的内存。

每个new获取的对象,必须用delete析构并释放内存,以免内存泄漏。

new运算符表达式是C++的一种语言结构,不可重载。但用户可重载operator new()函数。

摘抄自维基百科:https://zh.wikipedia.org/wiki/New_(C%2B%2B) 【访问该网址,学习new的更多语法特性,需要科学上网】

 


new用法的初步印象

开辟空间:
对于一个数:
		类型* 名字 = new 类型; //申请的该段内存没有进行任何操作;
		类型* 名字 = new 类型(); //将该段内存初始化为0;
  		类型* 名字 = new 类型(初始化值); //将该段内存初始化为一个确定的值;
	
对于一个数组:
		类型* 名字 = new 类型[数组大小];
		类型* 名字 = new 类型[数组大小](初始化值); //该数组的所有元素都赋值为一个确定的值;
		类型* 名字 = new 类型[数组大小]();  //该数组的所有元素都赋值为0;

释放空间:
	delete 名字; //一个数;
	delete[] 名字; //一个数组;

 


一维动态数组

#include <iostream>

using namespace std;

int main()
{
	int n = 10; //动态一维数组长度
	int* a = new int[n]; //申请一维动态数组的空间
	int i; //循坏变量

	for (i = 0; i < n; i++)
	{
		a[i] = i;
	}

	for (i = 0; i < n; i++)
	{
		cout << a[i] << "  ";
	}

	delete[] a; //释放一维数组的空间

	return 0;
}

 


二维动态数组

错误的二维动态数组申请

void test01()
{
       int size = 50, Column = 50;
       //从定义一维动态数组中,引申二维动态数组的申请;
       int(*p)[Column] = new int[size][Column]; //编译出错!!!
}

这样的语句,编译器通不过,为什么呢?

首先 new int[size][Column] 就是动态生成时确定的,所以它没有错

那么就是 int(*p)[Column],这句有问题了,这句为什么不对呢, 那是因为,这是一个定义语句,而定义语句先经过编译器进行编译,当编译器运行到此处时,发现Column 不是常数,因此不能通过编译。 而之所以编译器认为Column 不是常数,是因为编译阶段,编译器起的作用是查语法错误,和预分配空间,它并不执行程序,因此,没有执行那个赋值语句(只是对这个语句检查错误,和分配空间),因此编译阶段,它将认为column 是个变量。所以上面的二维数组定义是错误的, 它不能通过编译。

如果改成这样:

void test02()
{
       int size = 50;
       int(*p)[50] = new int[size][50];
}

便正确了。由此可见,这种动态分配数组,仅对一维数组空间是真正动态分配的。

 

实现二维动态数组

//实现二维动态数组
#include <iostream>
using namespace std;

int main()
{
	int row = 2; //行,x正方形
	int column = 3; //列,y负方向
	/*
	2行3列为:
	第一行第一列	第一行第二列
	第二行第一列	第二行第二列
	*/
	int i, j; //循环变量

	int** aa = new int* [row]; //申请row个行指针

	for (i = 0; i < row; i++)
	{
		aa[i] = new int[column]; //每个行指针有column个容量
		for (j = 0; j < column; j++)
		{
			aa[i][j] = i * j;
		}
	}

	for (i = 0; i < row; i++)
	{
		for (j = 0; j < column; j++)
		{
			printf("%d ", aa[i][j]);
		}
		printf("\n");
	}

	for (i = 0; i < row; i++)
	{
		delete[] aa[i];
	}
	delete[] aa;

	return 0;
}

 

 

 

C++中使用指针 new申请内存、创建数组、传递 C++中使用指针new申请内存,创建数组,传递 阅读详情

相关推荐

C++中使用new动态声明二维数组的方式

C++中动态二维数组的声明方式 在C/C++中定义动态数组时我们都很熟悉使用的是 new 关键字,基本语法如下: typeName *arrayName = new typeName[arraySize]; 比如若想通过输入的 n 来创建一个数组大小为 n 的 int 型数组时,可以这样写: cin >> n; int *a = new int[n]; 通过上面这个语句我们在内存地址中分配了一片 int[n] 大小的内存空间,并将其首地址赋值给了 a ,在这里 a 是 int* 类型的指针变

weixin_42426940的博客 6174

C++ 动态数组(new)

原文链接:动态数组(new) 一、动态数组的定义 数组的维度可以为常量、也可以为一个函数的返回值 int size() { return 3; } const int length = 3; int *p1 = new int[size()]{1,2,3}; int *p2 = new int[length]; int *p3 = new int[3]; 使用typedef为数组类型取别名 typedef int arrT[42]; int *p=new arrT; //分配一个大小

baidu_41388533的博客 5万+

使用new来创建动态数组

原文来自:http://book.51cto.com/art/201211/367161.htm 使用new来创建动态数组(1) 如果程序只需要一个值,则可能会声明一个简单变量,因为对于管理一个小型数据对象来说,这样做比使用new和指针更简单,尽管给人留下的印象不那么深刻。通常,对于大型数据(如数组、字符串和结构),应使用new,这正是new的用武之地。例如,假设要编写一个程序,它是...

diaoyikun5224的博客 1934

C++用new创建动态数组

如果通过像下面这样一般的方法来声明数组,则在程序编译的时候为其分配内存,不管程序最终是否用到这个数组,数组都在那里并占用内存,即静态联编。但是如果使用new,则在运行阶段需要它才进行创建,不需要则不创建,这叫动态联编,这种创建的数组叫做动态数组。并且静态联编必须在写程序时就声明数组长度,而动态联编在运行时才确定数组的长度。我们创建了一个动态数组指针p3后,我们可以通过p3[i]来直接访问数组中的第i个元素。上述代码使得声明一个长为3,类型为double的动态数组。并且动态分配一个空数组是合法的!...

qq_55621259的博客 9511

ESP32小车DIY:从零搭建无线遥控智能车(附完整代码与避坑指南)

本文详细介绍了如何从零开始DIY一台基于ESP32的无线遥控智能小车。内容涵盖核心硬件选型、电路设计、低延迟ESP-NOW无线通信协议的配置与实战,以及双电机差速控制算法与PWM调速的实现。文章提供了完整的代码示例和关键的避坑指南,旨在帮助开发者快速构建稳定可靠的智能车平台,并为进一步的功能扩展奠定基础。

gamma的博客 469

手把手教你用Wireshark国密版分析TLCP和IPSec协议(附下载地址)

本文详细介绍了Wireshark国密版在TLCP和IPSec协议分析中的实战应用,包括环境配置、协议解析、合规性检查及高级分析技巧。该工具针对商用密码算法(如SM2/SM3/SM4)进行了专项优化,支持GB/T 38636-2020 TLCP和GB/T 36968-2018 IPSec VPN等国家标准,帮助开发者与安全工程师高效完成密评分析任务。

weixin_29325955的博客 551

C++ new和数组

大多数应用应该使用标准库容器而不是动态分配的数组,使用容器更为简单、更不容易出现内存管理错误并且可能有更好的性能。 1. new和delete运算符一次分配/释放一个对象。 2.为了让new分配一个数组对象,我们需要在类型名之后跟一对方括号,在其中指明要分配的对象的数目。     int *p = new int[INT_NUM];//方括号中的数必须是整型,但不必是常量

少年乖 1万+

PLc S7-200 smart如何使用Modbus 485通讯传输接收数据

西门子在 STEP 7-Micro/WIN SMART 中正式推出 Modbus RTU 主站协议库(西门子标准库指令)。使用 Modbus RTU 主站指令库,可以读写 Modbus RTU 从站的数字量、模拟量 I/O 以及保持寄存器,从而实现PLC通过modbus方式控制其他器件。提示:以下是本篇文章正文内容,下面案例可供参考。

xjbsw0的博客 6万+

C++:new的用法

虽然对象1及3的空间被回收,但对象1与3并未析构!这一点将时刻提醒我们使用定位new需要自己显式调用析构函数,完成对象的析构!显然,如果类动态地为其成员分配内存,这将引发问题!,所以,当我们使用定位new创建对象必须自己保证不会覆盖任何不想丢失的数据!new只申请内存空间,相当于malloc,delete相当于free。1.new operator(初始化对象=申请内存空间+内存定位)换句话说就是,现在空间已经有了,不需要。在已有的空间上调用构造函数构造对象而已。指向的对象位于内存缓冲区,该空间并不是。

qq_39200110的博客 1万+

90+个各种疾病相关医疗数据集

含新冠、传染病、医学图像等

2万+

OC5021B 100V宽电压输入 LED车灯/大功率照明 DC降压型恒流驱动器

适用于LED大功率汽车大灯/大功率照明 OC5021B 100V宽电压输入 5A电流设计 DC-DC降压型恒流驱动IC

Handsome63841990的博客 2417

深入C++的new和traits

http://blog.youkuaiyun.com/songthin/article/details/1703966 当使用关键字new在堆上动态创建一个对象时,它实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。当然,如果我们创建的是简单类型的变量,那么第二步会被省略。假如我们定义了如下一个类A: class A {    int i; public:    A(int _

tenal09的专栏 388

基于树莓派4B与NCNN的YOLOv8高效部署实战:无GPU环境下的C++加速优化全流程指南**

本文详细介绍了在树莓派4B上基于NCNN框架部署YOLOv8目标检测模型的全流程。内容包括:从PyTorch模型导出NCNN格式文件、树莓派环境配置(OpenCV和NCNN编译)、C++实现代码解析(含模型加载、推理及后处理),以及实际部署测试结果。在树莓派4B上达到约2FPS,并提供INT8量化、多线程等优化建议。该方案为无GPU设备提供了轻量化目标检测的实用部署方案,适合边缘计算场景。

FJN110的博客 917

C++ new申请二维动态数组详解

C++ new申请二维动态数组详解 new关键字 new关键字用于申请一段动态内存空间,位于堆上,在程序运行过程中才执行。可以用来创新数组和实例化对象。 如图所示:用new申请一维动态数组,大小为5。 int *arrayPtr=new int[5]; 其中new后面接的是对象,上面为一个int[5]的数组,其返回值为指向数组元素的指针变量。即申请了sizeof(int)*5个字节大小的内存,并返回其地址值存放于指针arrayPtr中。 二维数组动态申请 方法一 int **arrayPtr=new in

weixin_44444450的博客 1万+

手把手教你学Simulink——基于新型电力电子拓扑与宽禁带器件的电网系统场景实例:GaN HEMT器件在高频逆变器中的开关特性建模

本文介绍了基于Simulink和Simscape Electrical的GaN HEMT高频逆变器建模方法。通过构建半桥拓扑电路,详细说明了GaN器件参数设置(以EPC2045为例)、专用驱动电路设计(含负压关断和米勒钳位)以及开关瞬态过程仿真(配置1ns步长捕捉MHz级特性)。重点分析了开关损耗计算和寄生导通风险,并对比了GaN与Si MOSFET的性能差异。案例展示了如何优化驱动参数和PCB布局,验证了GaN器件在1MHz高频应用中的优势(开关损耗仅5μJ)。最后总结了GaN在数据中心电源、无线充电等领

MHD0815的博客 403

深度学习-161-Dify工具之对比使用工作流和聊天流生成图表可视化的html文件

分别使用聊天流和工作流进行数据分析结果的可视化,生成html文件。聊天流可以配置带记忆,这样就可以多次交互优化结果。

qq_20466211的博客 1709

c++动态数组的使用 new

在c++中,有的时候会遇到变长的数组(不管是一维的还是二维的),这个时候就需要用到动态数组了,并且要用new和delete两个操作符,这俩操作符一般成对使用。 一维的动态数组 #include<iostream> using namespace std; int main() { int n; //输入数组长度 cin >> n; int* p= new int[n]; /*创建了一个长度为n的动态数组,并且返回这个数组的首地址给p,p就指向了这个动态数组,可以通过

Coding_Czx的博客 7105

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C++中new和delete来创建和释放动态数组

在C++编程中,使用new创建数组然后用delete来释放。 一、创建并释放一维数组 #include<iostream> using namespace std; int main() { int n; cin>>n; //分配动态一维数组 int *arr=new int[n]; for(int i=0;i&lt...

优快云131137的博客 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【和春笋一起学C++】使用new创建动态数组

上面这种方式创建的数组在程序编译时将为它分配内存空间,不管程序最终是否使用数组,数组都在那里,它占用了内存空间。在编译时给数组分配内存被称为静态联编,意味着数组是在编译时加入到程序中的。但如果使用new创建数组,则不在编译阶段为数组分配内存空间,而是在运行阶段创建并分配内存空间。在运行阶段,如果用到了数组则创建,如果用不到数组则不创建,称为动态联编。数组在程序运行时创建,这种数组叫动态数组。......使用静态联编时,必须在编写程序时指定数组的长度,使用动态联编时,程序在运行时确定数组的长度。

计算机视觉算法开发与落地 2117

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C++ - new - 动态数组 - 初始化

数组的动态初始化 在代码的时候看到了new初始化的一些问题,查阅了相关文档总结如下。可直接阅读结论部分,文档内内容在下面。 结论: int *p = new int[10]; // 每个元素都没有初始化 int *p = new int[10] (); // 每个元素初始化为0 int *p = new int(7); // 元素初始化为8 int *p = new int(); // 元素初始化...

Anadem‘s Blog 2万+

C++ 使用new创建动态数组

如果程序只需要一个值,则可能会声明一个简单变量,因为对于管理一个小型数据对象来说,这样做比使用new和指针更简单,尽管给人留下的印象不那么深刻。通常,对于大型数据(如数组、字符串和结构),应使用new,这正是new的用武之地。如果使用new时,不带方括号,则使用delete也不应带方括号。然而,对于ANSI/ISO标准来说,new与delete的格式不匹配导致的后果是不确定的,这意味着程序员不能依赖于某种特定的行为。~如果使用new[]为数组分配内存,则应使用delete [ ] 来释放。

qq_41583263的博客 5158

C++New关键字创建动态数组

1.使用New运算符创建一维数组 type *name = new type[size]; size可以是常量也可以是变量 2.使用New运算符创建二维数组 一定要注意,必须b维度是确定的,type name[a][b]; 在C++中,数组可以被视为一种类型,二维数组本身会被解释成一个一维数组:这个数组的元素类型为另一种一维数组。 第一种方法示例: void TestFunc_(unsigned ...

weixin_42708378的博客 2005

使用new创建动态数组

请注意将p3 加1的效果。因此我们一般选择使用new来创建数组,在运行阶段需要数组,我们则创建它,不需要时,就不创建。我们将指针看作一个指向该元素(数组第一个元素)的手指,int占4个字节,则将手指沿着正确的方向移动4个字节,而后指向第2个元素.....最后指向到第十个元素,这就是手指的移动范围,new语句中提供了识别内存块的每个元素所需要的全部信息。psome是一个指向int(数组第一个元素)的指针,由于编译器不能对psome指向10个整数中的第1个这种情况进行处理,因此,我们应该让程序跟踪元素的数目。

2301_79937517的博客 2316

C++动态申请数组

C++动态申请数组 1.使用new运算符来申请数组更加简便,同时也会使指针更像数组。 2.每一次new操作都会向内存申请一块连续的地址空间,也就是说二维数组相邻的列在 内存中地址不一定是相邻的。 3.C++中申请内存不必区分基本类型还是自定义的类,都是统一的定义方法。 申请一个大小为 n=10 的一维数组 int n = 10; int* a = new int[n]; /*...

路漫漫其修远兮,吾将上下而求索。 7073

C++使用new创建动态数组

在C++中,我们可以通过new来声明动态数组,示例如下: int* ptr = new int [10]; 通过这一行代码,我们即可实现声明一个int类型,元素个数为10个的指针,ptr指向当前动态数组的第一个元素,若想要访问动态数组的其他元素 ,则该怎么办呢? 在C++中,指针名则可充当数组名使用,如上述定义的数组,我们访问第一个元素*ptr来访问第一个元素,也可通过ptrp[0],ptr[...

weixin_39583302的博客 2119
上一篇: 【C数据类型】动态数组的使用方法(总结)
下一篇: 【树】对树的初步认识:树的表示法与存储结构
ALGO阿狗
博客等级 码龄9年 64粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值