内存管理是管理计算机内存的过程,将内存空间分配给程序以提高系统的整体性能。
我们知道数组存储的是同构数据,所以大多数时候,内存是在声明时分配给数组的。有时在运行时才确定确切的内存时会出现这种情况。为避免这种情况,我们声明了一个具有最大大小的数组,但一些内存将未被使用。为了避免内存的浪费,我们使用new运算符在运行时动态分配内存。
在C 语言中,我们使用malloc()或calloc()函数在运行时动态分配内存,而 free() 函数用于释放动态分配的内存。C++也支持这些功能,但C++ 还定义了诸如new和delete之类的一元运算符来执行相同的任务,即分配和释放内存。
new运算符用于创建对象,而delete运算符用于删除对象。当使用 new 运算符创建对象时,该对象将一直存在,直到我们显式使用 delete 运算符删除该对象。因此,我们可以说对象的生命周期与程序的块结构无关。
pointer_variable = new data-type
上面的语法用于使用 new 运算符创建对象。在上面的语法中,‘pointer_variable’是指针变量的名称,‘new’是运算符,‘data-type’定义了数据的类型。
int *p; p = new int;
在上面的示例中,'p' 是一个 int 类型的指针。
float *q; q = new float;
在上面的示例中,'q' 是一个 float 类型的指针。
在上面的例子中,指针的声明和它们的赋值是分开进行的。我们还可以将这两个语句组合如下:
int *p = new int; float *q = new float;
为新创建的对象赋值的两种方式:
我们可以简单地使用赋值运算符将值赋给新创建的对象。在上面的例子中,我们分别创建了两个类型为 int 和 float 的指针 'p' 和 'q'。现在,我们按如下方式分配值:
*p = 45; *q = 9.8;
我们将 45 分配给新创建的 int 对象,将 9.8 分配给新创建的 float 对象。
我们还可以使用 new 运算符来赋值,具体操作如下:
pointer_variable = new data-type(value);
让我们看一些例子。
int *p = new int(45); float *p = new float(9.8);
我们知道,new运算符用于为任何数据类型甚至用户自定义数据类型(如数组、结构、联合等)创建内存空间,因此创建一维数组的语法如下:
pointer-variable = new data-type[size];
int *a1 = new int[8];
在上面的语句中,我们创建了一个大小等于 8 的 int 类型数组,其中 p[0] 指第一个元素,p[1] 指第一个元素,依此类推。
当不再需要内存时,就需要释放它,以便将内存用于其他目的。这可以通过使用删除运算符来实现,如下所示:
delete pointer_variable;
在上面的语句中,'delete'是用于删除现有对象的操作符,'pointer_variable'是指针变量的名称。
在前面的例子中,我们使用 new 运算符创建了两个指针 'p' 和 'q',可以使用以下语句将其删除:
delete p; delete q;
也可以使用以下语法从内存空间中删除动态分配的数组:
delete [size] pointer_variable;
在上面的语句中,我们需要指定大小来定义需要释放的元素数量。这种语法的缺点是我们需要记住数组的大小。但是,在最近的 C++ 版本中,我们不需要像下面这样提及大小:
delete [ ] pointer_variable;
我们通过一个简单的例子来理解:
#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语句删除对象。
输出
以下是 new 运算符相对于 malloc() 函数的优点:
它不使用 sizeof() 运算符,因为它会自动计算数据对象的大小。
它会自动返回正确的数据类型指针,因此不需要使用类型转换。
与其他运算符一样,new 和 delete 运算符也可以重载。
它还允许您在为对象创建内存空间的同时初始化数据对象。