c++动态内存

C++ Code:动态分配数组内存的六种方法 问题:         如何快速给数组分配自定义长度的内存,方法有哪些?         本博客提供六种方法介绍,包含各种常用用法,且代码片亲自 编写-注解-编译-通过,对读者负责。 阐述:         提到动态分配C++的数组,我们想到的标签会有:malloc-free、new-delete、一维、二维...等等,本博客初创初心是各大公司企业都会青睐于在笔试或者面试中,要求应届生具备 阅读详情

C++ 动态内存

了解动态内存在 C++ 中是如何工作的是成为一名合格的 C++ 程序员必不可少的。C++ 程序中的内存分为两个部分:

  • 栈:在函数内部声明的所有变量都将占用栈内存。
  • 堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存。

很多时候,您无法提前预知需要多少内存来存储某个定义变量中的特定信息,所需内存的大小需要在运行时才能确定。

在 C++ 中,您可以使用特殊的运算符为给定类型的变量在运行时分配堆内的内存,这会返回所分配的空间地址。这种运算符即 new 运算符。

如果您不再需要动态分配的内存空间,可以使用 delete 运算符,删除之前由 new 运算符分配的内存。

new 和 delete 运算符

下面是使用 new 运算符来为任意的数据类型动态分配内存的通用语法:

new data-type;

在这里,data-type 可以是包括数组在内的任意内置的数据类型,也可以是包括类或结构在内的用户自定义的任何数据类型。让我们先来看下内置的数据类型。例如,我们可以定义一个指向 double 类型的指针,然后请求内存,该内存在执行时被分配。我们可以按照下面的语句使用 new 运算符来完成这点:

double* pvalue = NULL; // 初始化为 null 的指针 pvalue = new double; // 为变量请求内存

如果自由存储区已被用完,可能无法成功分配内存。所以建议检查 new 运算符是否返回 NULL 指针,并采取以下适当的操作:

double* pvalue = NULL; if( !(pvalue = new double )) { cout << "Error: out of memory." <<endl; exit(1); }

malloc() 函数在 C 语言中就出现了,在 C++ 中仍然存在,但建议尽量不要使用 malloc() 函数。new 与 malloc() 函数相比,其主要的优点是,new 不只是分配了内存,它还创建了对象。

在任何时候,当您觉得某个已经动态分配内存的变量不再需要使用时,您可以使用 delete 操作符释放它所占用的内存,如下所示:

delete pvalue;        // 释放 pvalue 所指向的内存

下面的实例中使用了上面的概念,演示了如何使用 new 和 delete 运算符:

实例

#include <iostream> using namespace std; int main () { double* pvalue = NULL; // 初始化为 null 的指针 pvalue = new double; // 为变量请求内存 *pvalue = 29494.99; // 在分配的地址存储值 cout << "Value of pvalue : " << *pvalue << endl; delete pvalue; // 释放内存 return 0; }

当上面的代码被编译和执行时,它会产生下列结果:

Value of pvalue : 29495

数组的动态内存分配

假设我们要为一个字符数组(一个有 20 个字符的字符串)分配内存,我们可以使用上面实例中的语法来为数组动态地分配内存,如下所示:

char* pvalue  = NULL;   // 初始化为 null 的指针
pvalue  = new char[20]; // 为变量请求内存

要删除我们刚才创建的数组,语句如下:

delete [] pvalue;        // 删除 pvalue 所指向的数组

下面是 new 操作符的通用语法,可以为多维数组分配内存,如下所示:

一维数组

// 动态分配,数组长度为 m int *array=new int [m]; //释放内存 delete [] array;

二维数组

int **array; // 假定数组第一维长度为 m, 第二维长度为 n // 动态分配空间 array = new int *[m]; for( int i=0; i<m; i++ ) { array[i] = new int [n]; } //释放 for( int i=0; i<m; i++ ) { delete [] array[i]; } delete [] array;

二维数组实例测试:

实例

#include <iostream> using namespace std; int main() { int **p; int i,j; //p[4][8] //开始分配4行8列的二维数据 p = new int *[4]; for(i=0;i<4;i++){ p[i]=new int [8]; } for(i=0; i<4; i++){ for(j=0; j<8; j++){ p[i][j] = j*i; } } //打印数据 for(i=0; i<4; i++){ for(j=0; j<8; j++) { if(j==0) cout<<endl; cout<<p[i][j]<<"\t"; } } //开始释放申请的堆 for(i=0; i<4; i++){ delete [] p[i]; } delete [] p; return 0; }

三维数组

int ***array; // 假定数组第一维为 m, 第二维为 n, 第三维为h // 动态分配空间 array = new int **[m]; for( int i=0; i<m; i++ ) { array[i] = new int *[n]; for( int j=0; j<n; j++ ) { array[i][j] = new int [h]; } } //释放 for( int i=0; i<m; i++ ) { for( int j=0; j<n; j++ ) { delete[] array[i][j]; } delete[] array[i]; } delete[] array;

三维数组测试实例:

实例

#include <iostream> using namespace std; int main() { int i,j,k; // p[2][3][4] int ***p; p = new int **[2]; for(i=0; i<2; i++) { p[i]=new int *[3]; for(j=0; j<3; j++) p[i][j]=new int[4]; } //输出 p[i][j][k] 三维数据 for(i=0; i<2; i++) { for(j=0; j<3; j++) { for(k=0;k<4;k++) { p[i][j][k]=i+j+k; cout<<p[i][j][k]<<" "; } cout<<endl; } cout<<endl; } // 释放内存 for(i=0; i<2; i++) { for(j=0; j<3; j++) { delete [] p[i][j]; } } for(i=0; i<2; i++) { delete [] p[i]; } delete [] p; return 0; }


对象的动态内存分配

对象与简单的数据类型没有什么不同。例如,请看下面的代码,我们将使用一个对象数组来理清这一概念:

实例

#include <iostream> using namespace std; class Box { public: Box() { cout << "调用构造函数!" <<endl; } ~Box() { cout << "调用析构函数!" <<endl; } }; int main( ) { Box* myBoxArray = new Box[4]; delete [] myBoxArray; // 删除数组 return 0; }

如果要为一个包含四个 Box 对象的数组分配内存,构造函数将被调用 4 次,同样地,当删除这些对象时,析构函数也将被调用相同的次数(4次)。

当上面的代码被编译和执行时,它会产生下列结果:

调用构造函数!
调用构造函数!
调用构造函数!
调用构造函数!
调用析构函数!
调用析构函数!
调用析构函数!
调用析构函数!

笔记:

1、

delete 与 delete[] 区别:

1、针对简单类型 使用 new 分配后的不管是数组还是非数组形式内存空间用两种方式均可 如:

int *a = new int[10];   
delete a;   
delete [] a; 

此种情况中的释放效果相同,原因在于:分配简单类型内存时,内存大小已经确定,系统可以记忆并且进行管理,在析构时,系统并不会调用析构函数, 它直接通过指针可以获取实际分配的内存空间,哪怕是一个数组内存空间(在分配过程中 系统会记录分配内存的大小等信息,此信息保存在结构体_CrtMemBlockHeader中, 具体情况可参看VC安装目录下CRT\SRC\DBGDEL.cpp)

2、针对类Class,两种方式体现出具体差异

当你通过下列方式分配一个类对象数组:

class A
{
    private:
        char *m_cBuffer;
        int m_nLen;
    public:
        A(){ m_cBuffer = new char[m_nLen]; }
        ~A() { delete [] m_cBuffer; }
};
A *a = new A[10];

// 仅释放了a指针指向的全部内存空间 但是只调用了a[0]对象的析构函数 剩下的从a[1]到a[9]这9个用户自行分配的m_cBuffer对应内存空间将不能释放 从而造成内存泄漏
delete a;

// 调用使用类对象的析构函数释放用户自己分配内存空间并且   释放了a指针指向的全部内存空间
delete [] a;

所以总结下就是,如果ptr代表一个用new申请的内存返回的内存空间地址,即所谓的指针,那么:

  •  delete ptr -- 代表用来释放内存,且只用来释放ptr指向的内存。
  •  delete[] rg -- 用来释放rg指向的内存,!!还逐一调用数组中每个对象的 destructor!!

对于像 int/char/long/int*/struct 等等简单数据类型,由于对象没有 destructor,所以用 delete 和 delete [] 是一样的!但是如果是C++ 对象数组就不同了!

数组的动态分配 一、一维数组的动态分配一维数组动态分配形式如下:int n=2; int *a = new int[n]; //动态分配的数组a存放在内存中的堆中 //使用完后要手动释放内存,否则会内存泄漏 delete [] a; //数组应该加上[]表明是个数组,虽然不加也不报错,但是有内存泄漏的风险 a=0; //将a赋值0,上面的删除虽然释放了内存占用的空间,但是变量a并没有消失,这里置零是为了避免a 阅读详情

相关推荐

C/C++动态内存管理

C/C++中的动态内存管理是指在程序运行时,根据需要动态地分配和释放内存空间。这种管理方式主要通过堆(Heap)内存来实现,与栈(Stack)内存不同,堆内存的分配和释放不由编译器自动管理,而是需要程序员手动控制。以下是C/C++动态内存管理的详细介绍:在C++中,动态内存分配主要通过和操作符来实现,而在C语言中,则使用、、和等函数。 calloc: 用于分配多个相同大小的内存块,并将其初始化为零。 realloc: 用于重新分配已分配的内存块的大小。 free: 用于释放之前通过、或分配的内

如无必要,勿增实体。 1886

C++ 动态内存

了解动态内存在 C++ 中是如何工作的是成为一名合格的 C++ 程序员必不可少的。C++ 程序中的内存分为两个部分: 栈:在函数内部声明的所有变量都将占用栈内存。 堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存。 很多时候,您无法提前预知需要多少内存来存储某个定义变量中的特定信息,所需内存的大小需要在运行时才能确定。在 C++ 中,您可以使用特殊的运算符为给定类型的变量在运行时分配堆内的

KopWelkin的博客 415

C++动态内存

动态内存 在上一章中看到的程序中,所有内存需求都是在程序执行之前通过定义所需的变量来确定的。但是在某些情况下,只能在运行时确定程序的内存需求。例如,何时需要存储空间取决于用户输入。在这些情况下,程序需要动态分配内存,为此C ++语言将运算符new和集成在一起delete。 Operators new and new[] 动态内存是使用operator分配的new。new后面跟一个数据类型说明符,如果需要一个以上的元素序列,则在方括号中将这些元素的数目[]。它返回一个指向分配的新内存块开头的指针。它的语法是:

希望我的博客,能帮上你解决学习中工作中所遇到的问题 457

C++动态分配数组

《C++教程》郑莉、李宁,人民邮电出版社,2010年第一版

Keep Going! 1万+

深入详解C/C++动态内存管理

本文详细讲述了C/C++动态内存管理方面的内容,并具体阐述了几类常见的动态内存异常,以供大家借鉴或参考!

dvlinker的技术专栏 2万+

STM32F1的USB接口-自定义HID

设置USB VID:1155 PID :22352。

chilian12321的博客 839

C++动态内存分配和数组及举例

C++入门基础(建议收藏!!!)

枫原万叶的博客 1001

避坑指南:QCustomPlot鼠标事件冲突解决方案(左键拖动vs右键框选)

本文深入解析QCustomPlot在QT框架下的高级交互实现,重点解决左键拖动与右键框选的冲突问题。通过自定义事件处理和QRubberBand技术,提供了一套完整的无冲突交互方案,帮助开发者优化数据可视化应用的用户体验。

moss5的博客 661

【带你吃透C++】C++动态内存管理

作为一名编程初学者,通常学习中,发生内存错误是件非常麻烦的事情。编译器不能自动发现这些错误,通常是在程序运行时才能捕捉到。而这些错误大多没有明显的症状,时隐时现,增加了改错的难度。 了解内存分配并掌握运用它是必不可少的。本文主要针对C++动态内存管理内容进行分享,如果想了解C语言动态内存管理可以参考:【C语言进阶】动态内存管理(详细介绍)

平淡中造就不平凡 7076

02 HCM CPI SF集成-组织集成(一)

将员工主数据和组织数据从SAP Successfactors Employee CentraI复制到SAPERP或SAP S/4HANA,SAP SF CPI HCM集成

SAP CPI 131

从Safety Manual到系统安全概念

本文系统阐述了构建功能安全"证据链"的工程化方法论,核心要点包括:1)建立"风险→对策→验证→证据"闭环链条;2)SafetyManual和FMEDA作为关键证据支撑点,前者界定系统安全边界,后者量化诊断覆盖率;3)通过四步法继承芯片安全机制并扩展至系统级;4)形成"设计-分析-验证"三维闭环体系,包括安全目标、技术实现和验证矩阵;5)强调证据链闭环对安全认证和OEM认可的重要性。该方法论实现了从理论要求到工程实践的完整转化,确保安全设计可验证、可

VehSwHwDeveloper的博客 724

C++之动态内存分配

C++动态内存分配:内存空间模型、动态内存分配概述;定位new运算符(什么是定位new运算符、定位new运算符的作用、如何使用定位new运算符);重载new和delete运算符;

qq_42279379的博客 2069

Linux kernel crypto的介绍和代码导读

在Linux kernel的module_init阶段会将algif_type_skcipher、algif_type_aead、algif_type_hash、algif_type_rng 四种算法注册.在userspace通过netlink调用了,kernel种的af_alg模块收到消息后, 根据上层传来的算法种类名字来选择走哪一个结构体(alg_type_xxx)的ops函数。也就是添加到af_alg维护的alg_types链表种. alg_types链表种仅有这四个数据.

baron-周贺贺-代码改变世界ctw 322

【c++】动态内存管理

1. new:首先调用operator new函数申请内存空间,然后调用构造函数,完成初始化2. delete:首先调用析构函数,对开辟的内存进行资源清理,然后调用operator delete函数释放内存3. new[]:首先调用 operator new[ ] 函数申请多个对象的内存空间(该函数中调用了operator new),然后调用N次构造函数,完成初始化。

2301_80955819的博客 1738

硬件工程师笔试面试高频考点汇总——(2025版)

《硬件工程师笔试面试知识汇总》一文系统梳理了硬件领域的核心知识体系,涵盖电子器件、模拟电路、数字电路等模块。文章详细解析了电阻、电容、电感等基础元件的选型与应用,深入探讨了三极管、MOS管等半导体器件的工作原理,并对比分析了DCDC与LDO等电源方案。在电路设计方面,提供了滤波器、放大器等实用电路的设计方法与仿真案例,同时包含UART、I2C等通信协议的实现要点。文章还整合了戴维宁定理等电路分析理论,并附有美团、联想等名企真题解析。通过器件特性、电路设计、企业真题三维度内容,为硬件工程师构建了完整的知识框架

XU157303764的博客 1万+

Windows密码忘了怎么办?一分钟看懂Windows密码底层机制:无需重装系统也能无痕找回登录密码

忘记Windows开机密码,不一定非得重装系统!本文手把手教你通过提取NTLM Hash值实现“无痕找回密码”,无需PE、无需清除密码,对系统零修改 🛡️ 搭配mimikatz与在线解密平台,小白也能快速上手,了解Windows密码底层机制 🔐

XiaoqiangClub的博客 130

C++——动态内存

在前面几章中看到的程序中,所有内存需求都是在程序执行之前通过定义所需的变量来确定的。但在某些情况下,程序的内存需求只能在运行时确定。例如,当所需的内存取决于用户输入时。在这些情况下,程序需要动态分配内存,为此,C++ 语言集成了运算符 和。delete。

zjx1415926的博客 1005

基于Simulink的电动汽车动力总成控制策略验证与标定仿真平台

电动汽车的动力总成(Powertrain)是车辆的核心系统,包括动力电池、电机控制器、逆变器和驱动电机等关键部件。动力总成的控制策略直接影响车辆的动力性能、能耗效率和驾驶体验。为了验证和优化这些控制策略,基于MATLAB/Simulink的仿真平台成为一种高效且经济的解决方案。本项目旨在构建一个完整的基于Simulink的电动汽车动力总成控制策略验证与标定仿真平台,涵盖控制策略建模、性能评估以及参数标定等功能模块,并通过仿真验证系统的有效性。

xiaoheshang_123的博客 177

[C++] 动态内存分配

C++ 动态内存分配

weixin_60479183的博客 4937

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

计算机控制技术及应用

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

【C/C++】动态内存管理

malloc calloc realloc free 柔性数组

凤年徐的博客 4836

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【C++】动态内存管理

介绍了内存分布、new delete 操作符及其底层原理和拓展操作

HDSTQTW的博客 1256

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C++如何申请动态内存

如果你错误地使用 `delete` 而不是 `delete[]`,这将导致未定义行为,因为 `delete` 只会调用单个对象的析构函数,而不是数组中每个对象的析构函数。

qq_43287763的博客 1368

C/C++——动态内存分配

C/C++——动态内存分配

祖国栋梁一的博客 6721

C/Cpp动态内存管理

本篇介绍:cpp中的动态内存开辟,包括new、delete

qq_61847875的博客 675

C++动态内存管理

C++动态内存管理

2301_76269963的博客 777
上一篇: c++异常处理
下一篇: c++命名空间
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值