C++ Memory Management 内存管理

什么是内存管理?

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

为什么需要内存管理?

我们知道数组存储的是同构数据,所以大多数时候,内存是在声明时分配给数组的。有时在运行时才确定确切的内存时会出现这种情况。为避免这种情况,我们声明了一个具有最大大小的数组,但一些内存将未被使用。为了避免内存的浪费,我们使用new运算符在运行时动态分配内存。

内存管理操作符

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

新运营商

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

句法 (Syntax)

pointer_variable = new data-type

上面的语法用于使用 new 运算符创建对象。在上面的语法中,‘pointer_variable’是指针变量的名称,‘new’是运算符,‘data-type’定义了数据的类型。

例子 (Example)

int *p;  
p = new int;

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

例子 (Example)

float *q;   
q = new float;

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

在上面的例子中,指针的声明和它们的赋值是分开进行的。我们还可以将这两个语句组合如下:

例子 (Example)

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

为新创建的对象赋值

为新创建的对象赋值的两种方式:

  • 我们可以简单地使用赋值运算符将值赋给新创建的对象。在上面的例子中,我们分别创建了两个类型为 int 和 float 的指针 'p' 和 'q'。现在,我们按如下方式分配值:

例子 (Example)

*p = 45;  
*q = 9.8;

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

  • 我们还可以使用 new 运算符来赋值,具体操作如下:

例子 (Example)

pointer_variable = new data-type(value);

让我们看一些例子。

例子 (Example)

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

如何创建一维数组

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

例子 (Example)

pointer-variable = new data-type[size];

例子 (Example)

int *a1 = new int[8];

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

删除运算符

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

例子 (Example)

delete pointer_variable;

在上面的语句中,'delete'是用于删除现有对象的操作符,'pointer_variable'是指针变量的名称。

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

例子 (Example)

delete p;  
delete q;

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

例子 (Example)

delete [size] pointer_variable;

在上面的语句中,我们需要指定大小来定义需要释放的元素数量。这种语法的缺点是我们需要记住数组的大小。但是,在最近的 C++ 版本中,我们不需要像下面这样提及大小:

例子 (Example)

delete [ ] pointer_variable;

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

例子 (Example)

#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++)   // for loop  
{  
cin>>arr[i];  
}  
cout<<"\n您输入的元素是:";  
for(int i=0;i<size;i++)    // for 循环 
{  
cout<<arr[i]<<",";  
}  
delete arr;  // 删除现有数组。 
return 0;  
}

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

输出

C++ 内存管理

新运营商的优势

以下是 new 运算符相对于 malloc() 函数的优点:

  • 它不使用 sizeof() 运算符,因为它会自动计算数据对象的大小。

  • 它会自动返回正确的数据类型指针,因此不需要使用类型转换。

  • 与其他运算符一样,new 和 delete 运算符也可以重载。

  • 它还允许您在为对象创建内存空间的同时初始化数据对象。


  • 使用社交账号登录,本站支持
全部评论(0)