什么是内存管理?

内存管理是一种管理计算机内存的过程,将内存空间分配给程序,以提高整个系统的性能。

为什么需要内存管理?

正如我们所知,数组存储同类型的数据,所以大多数情况下,内存在声明数组时就会被分配。有时候会出现在运行时无法确定确切内存大小的情况。为了避免这种情况,我们使用new运算符在运行时动态分配内存空间,避免内存的浪费。

内存管理运算符

在C语言中,我们使用malloc()或calloc()函数在运行时动态分配内存,并使用free()函数释放动态分配的内存。C++也支持这些函数,但C++还定义了一元运算符,如new和delete,用于执行相同的任务,即分配和释放内存。

new运算符

new运算符用于创建对象,而delete运算符用于删除对象。当使用new运算符创建对象时,对象将存在,直到我们显式使用delete运算符来删除对象。因此,我们可以说对象的生命周期与程序的块结构无关。

语法

指针变量 = new 数据类型

上述语法用于使用new运算符创建对象。在上述语法中,'指针变量'是指针变量的名称,'new'是运算符,'数据类型'定义数据的类型。

示例1:

int *p;
p = new int;

在上面的示例中,'p'是一个int类型的指针。

示例2:

float *q;
q = new float;

在上面的示例中,'q'是一个float类型的指针。

在上述情况下,指针的声明和赋值是分开进行的。我们也可以将这两个语句合并如下:

int *p = new int;
float *q = new float;

为新创建的对象分配值

有两种方法可以为新创建的对象分配值:

  • 我们可以使用赋值运算符将值赋给新创建的对象。在上述情况中,我们分别创建了两个指针'p'和'q',类型分别为int和float。现在,我们将值分配如下:
*p = 45;
*q = 9.8;

我们将45分配给新创建的int对象,将9.8分配给新创建的float对象。

  • 我们也可以使用new运算符分配值,示例如下:
 指针变量 = new 数据类型(值);

让我们看一些示例。

int *p = new int(45);
float *p = new float(9.8);

如何创建一维数组

正如我们所知,new运算符用于为任何数据类型(甚至包括用户定义的数据类型,如数组、结构体、联合体等)创建内存空间,因此创建一维数组的语法如下:

指针变量 = new 数据类型[大小];

示例:

 int *a1 = new int[8];

在上述语句中,我们创建了一个int类型的数组,大小为8,其中p[0]指代第一个元素,p[1]指代第二个元素,依此类推。

delete运算符

当不再需要内存时,需要将其释放,以便内存可以用于其他目的。这可以通过使用delete运算符来实现,如下所示:

delete 指针变量;

在上述语句中,'delete'是用于删除现有对象的运算符,'指针变量'是指针变量的名称。

在前面的例子中,我们使用new运算符创建了两个指针'p'和'q',可以通过以下语句删除它们:

delete p;
delete q;

动态分配的数组也可以通过以下语法从内存空间中删除:

delete [大小] 指针变量;

在上述语句中,我们需要指定大小,该大小定义了要释放的元素数量。这种语法的缺点是我们需要记住数组的大小。但是,在最新的C++版本中,我们不需要指定大小,如下所示:

delete [] 指针变量;

让我们通过一个简单的示例来理解:

#include <iostream>
using namespace std;
int main()
{
int size; // 变量声明
int *arr = new int[size]; // 创建数组
cout<<"请输入数组的大小:";
std::cin >> size; //
cout<<"\n请输入元素:";
for(int i=0;i<size;i++) // 循环
{
cin>>arr[i];
}
cout<<"\n您输入的元素为:";
for(int i=0;i<size;i++) // 循环
{
cout<<arr[i]<<",";
}
delete arr; // 删除现有数组
return 0;
}

在上面的代码中,我们使用new运算符创建了一个数组。上面的程序将在运行时接受用户输入的数组大小。当程序完成所有操作后,它使用delete arr语句删除对象。

输出:

1.png

C++内存管理 new运算符的优势

  • new运算符相对于malloc()函数具有以下优势:
  • 它不使用sizeof()运算符,因为它会自动计算数据对象的大小。
  • 它自动返回正确的数据类型指针,因此不需要使用类型转换
  • 与其他运算符一样,new和delete运算符也可以重载。
  • 它还允许您在为对象创建内存空间时初始化数据对象。

标签: C++语言, C++语言教程, C++语言技术, C++语言学习, C++语言学习教程, C++语言下载, C++语言开发, C++语言入门教程, C++语言进阶教程, C++语言高级教程, C++语言面试题, C++语言笔试题, C++语言编程思想