C++ 动态内存分配

C++ 动态内存分配

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

C++ 动态内存分配

内存分配

保留或提供变量的空间称为内存分配。内存分配有两种方式:

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

为什么需要动态内存分配?

在程序处于运行状态时,我们可以动态地分配存储空间,但变量不能随意创建。因此,动态内存分配有两个条件 –

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

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

C++中,内存分为两部分 –

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

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

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

语法

指针变量 = new 数据类型;

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

示例

int *m = 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运算符中使用nothrow。因此,最佳实践是先检查指针变量。

代码:

int *m = new(nonthrow) int;
if(!m) // check if memory is available 
{
    cout<< "No memory allocated";
}

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

删除操作符

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

语法

delete 指针变量名

示例

delete m; // 释放变量 m

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

示例演示动态内存分配

// The program will show the use of new and delete
#include 
using namespace std;
int main ()
{
    // Pointer initialization to null
    int* m = NULL;

    // Request memory for the variable
    // using new operator
    m = new(nothrow) int;
    if (!m)
        cout<< "allocation of memory failed\n";
    else
    {
        // Store value at allocated address
        *m=29;
cout<< "Value of m: " << *m <

输出

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

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程