C++ 动态内存分配

17 Mar 2025 | 4 分钟阅读

有时,需要输入的数据是在执行时分配的。例如,随着组织中新员工的雇佣,员工列表会增加,同样,当有人离开组织时,员工列表会减少。这称为内存管理。现在,让我们讨论动态内存分配的概念。

Dynamic memory allocation in C++

内存分配

为变量保留或提供空间称为内存分配。为了存储数据,内存分配可以通过两种方式完成 -

  • 静态分配或编译时分配 - 静态内存分配意味着为变量提供空间。变量的大小和数据类型是已知的,并且在整个程序中保持不变。
  • 动态分配或运行时分配 - 内存动态分配的分配方式。在这种类型的分配中,变量的确切大小是事先未知的。指针在动态内存分配中扮演着重要角色。

为什么选择动态内存分配?

我们可以在程序运行时动态分配存储空间,但变量不能“即时”创建。因此,动态内存分配有两个标准 -

  • 需要内存中的动态空间。
  • 存储地址以从内存访问变量。

同样,我们对内存中的变量进行内存释放。

在 C++ 中,内存分为两部分 -

  • 栈 - 在任何函数内部声明的所有变量都从栈中占用内存。
  • 堆 - 它是程序中未使用的内存,通常用于动态内存分配。

使用 new 运算符进行动态内存分配

为了动态分配空间,使用运算符 new。它意味着在自由存储区请求内存分配。如果内存可用,内存将被初始化,并将该空间的地址返回给指针变量。

语法

指针_变量 = new 数据类型;

指针_变量是指针数据类型。数据类型可以是 int、float、string、char 等。

示例

int *m = NULL // 最初我们有一个 NULL 指针

m = new int // 为变量请求内存

它可以直接通过将以下语句放在一行中声明 -

int *m = new int

初始化内存

我们也可以使用 new 运算符初始化内存。

例如

int *m = new int(20);

Float *d = new float(21.01);

分配一块内存

我们还可以使用 new 运算符分配特定数据类型的一块(数组)内存。

例如

int *arr = new int[10]

这里我们为十个整数动态分配了内存,它还返回一个指向数组第一个元素的指针。因此,arr[0] 是第一个元素,依此类推。

注意

  • 创建普通数组和使用 new 分配块之间的区别在于,普通数组由编译器释放。而动态创建的块直到程序员删除它或程序终止才会释放。
  • 如果堆内存中没有空间,new 请求将导致失败并抛出异常 (std::bad_alloc),除非我们与 new 运算符一起使用 nonthrow。因此,最佳实践是首先检查指针变量。

编码

既然我们已经动态分配了内存。让我们学习如何删除它。

delete 运算符

我们使用 delete 运算符在 C++ 中删除已分配的空间。

语法

delete 指针_变量名

示例

delete m; // 释放变量 m

delete [] arr; // 释放一块内存

演示动态内存分配的示例

输出

Value of m: 29
Value of f: 75.25
Value store in block of memory: 1 2 3 4 5