当前位置: 首页 > article >正文

Day27 C++ 动态内存

2024.12.19 C++ 动态内存

动态内存

充分了解动态内存在C++中的实际工作方式对于成为一名优秀的C++程序员至关重要。C++程序中的内存分为两部分-

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

很多时候,您不会事先知道将特定信息存储在定义的变量中需要多少内存,并且可以在运行时确定所需内存的大小。您可以使用C++中的特殊运算符在运行时为给定类型的变量在堆中分配内存,该运算符返回分配的空间的地址。该运算符称为新运算符。如果不再需要动态分配的内存,则可以使用delete运算符,该运算符将取消分配由new运算符先前分配的内存。

new和delete运算符

以下是通用语法,可使用new运算符为任何数据类型动态分配内存。

new data-type;

此处,数据类型可以是任何内置数据类型,包括数组,也可以是任何用户定义的数据类型,包括类或结构。让我们从内置数据类型开始。例如,我们可以定义一个指针来输入double类型,然后请求在执行时分配内存。我们可以使用带有以下语句的new运算符来做到这一点-

double* pvalue  = NULL; // double* pvalue 声明了一个指针 pvalue,它可以指向一个 double 类型的变量。
pvalue  = new double;   // Request memory for the variable

如果空闲存储已用完,则可能未成功分配内存。因此,优良作法是检查new运算符是否返回NULL指针并采取以下适当的操作-

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

C语言中的 malloc() 函数仍然存在于C++中,但是建议避免使用malloc()函数。与malloc()函数相比,

new的主要优点是new不仅分配内存,而且还构造了对象。这是C++的主要目的。

无论何时,当您感觉不再需要动态分配的变量时,都可以使用“delete”运算符释放它在免费存储区中占用的内存,如下所示:

delete pvalue;        // Release memory pointed to by pvalue

让我们提出以上概念并形成以下示例,以展示“new”和“delete”的工作方式-

#include <iostream>
using namespace std;

int main () {
   double* pvalue  = NULL; // Pointer initialized with null
   pvalue  = new double;   // Request memory for the variable
 
   *pvalue = 29494.99;     // 指针 pvalue 将 29494.99 赋值给 pvalue 所指向的内存地址中的内容。
   cout << "Value of pvalue : " << *pvalue << endl;

   delete pvalue;         // free up the memory.

   return 0;
}

如果我们编译并运行以上代码,这将产生以下结果-

Value of pvalue : 29495

数组的动态内存分配

考虑要为一个字符数组(即20个字符的字符串)分配内存。使用与上面相同的语法,可以动态分配内存,如下所示。

char* pvalue  = NULL;         // Pointer initialized with null
pvalue  = new char[20];       // Request memory for the variable

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

delete [] pvalue;             // Delete array pointed to by pvalue

遵循new运算符的类似通用语法,您可以按如下所示分配多维数组

double** pvalue  = NULL;      // Pointer initialized with null 
pvalue  = new double [3][4];  // Allocate memory for a 3x4 array 

但是,为多维数组释放内存的语法将仍然与上述相同-

delete [] pvalue;            // 用来释放动态分配的数组所占用的内存。

对象的动态内存分配

对象与简单数据类型没有什么不同。例如,考虑以下代码,我们将使用对象数组来阐明概念-

#include <iostream>
using namespace std;

class Box {
   public:
      Box() { 
         cout << "Constructor called!" << endl; 
      }
      ~Box() { 
         cout << "Destructor called!" << endl; 
      }
};
int main() {
   Box* myBoxArray = new Box[4];
   delete [] myBoxArray; // Delete array

   return 0;
}

如果要分配一个包含四个Box对象的数组,则将简单调用构造函数四次,并在删除这些对象时类似地将其调用相同次数。如果我们编译并运行以上代码,这将产生以下结果-

Constructor called!
Constructor called!
Constructor called!
Constructor called!
Destructor called!
Destructor called!
Destructor called!
Destructor called!

http://www.kler.cn/a/445091.html

相关文章:

  • Springboot 学习 之 logback-spring.xml 日志压缩 .tmp 临时文件问题
  • 首次下载steam更新速度慢解决方法
  • springboot445新冠物资管理(论文+源码)_kaic
  • Vue2二、指令补充,computed 计算属性vs方法,watch 侦听器,
  • springboot java ffmpeg 视频压缩、提取视频帧图片、获取视频分辨率
  • qemu源码解析【04】qom实例
  • ArcGIS Pro 3.4新功能3:空间统计新特性,基于森林和增强分类与回归,过滤空间自相关
  • CTFHUB 历年真题 afr-1
  • 如何编辑调试gradle,打印日志
  • upload-labs靶场
  • uniapp小程序抽奖怎么做?直接使用【almost-lottery转盘组件】或者【自定义宫格转盘】
  • SL4008B升降压芯片 9-36V降12V/2A 耐压40V 外置MOS管 80W大功率IC
  • 自动化运维平台的选型指南:开源与商业化工具对比
  • TypeScript 与前端框架React
  • 解决git报错:fatal: unable to connect to cache daemon: Unknown error
  • 小白投资理财 - 看懂 SAR 抛物线转向指标
  • qt学习之用qlabel制作假表格
  • Java项目常见基础问题汇总(2)
  • docker(wsl)命令 帮助文档
  • 编程训练系统(代码+数据库+LW)
  • 《全面解析 QT 各版本:特性、应用与选择策略》
  • 二百八十、ClickHouse——用Kettle对DWD层补全的清洗数据进行记录
  • 【真人模型】Stable Diffusion:人脸特美的人像摄影大模型
  • MySQL批量删除字段跑路?
  • Ubuntu 22.04永久保存路由
  • Vue3组件数据双向绑定