C++ 内存管理

C++ 内存管理 首页 / C++入门教程 / C++ 内存管理

数组存储同类数据,因此大多数时候,内存是在声明时分配给数组的。有时,直到运行时才确定确切的内存,才会出现这种情况。为了避免这种情况,我们声明了一个最大大小的数组,但是会占用一些内存。为了避免浪费内存,我们使用new运算符在运行时动态分配内存。

内存管理操作

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

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

语法

pointer_variable = new data-type

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

示例1:

int *p;
p = new int;

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

示例2:

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];

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

delete运算符

如果不再需要内存,则需要重新分配内存,以便可以将内存用于其他用途。可以通过使用delete运算符来实现,如下所示:

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<<"Enter the size of the array : ";   
  std::cin >> size;   //
  cout<<"\nEnter the element : ";
  for(int i=0;i<size;i++)  //for 循环
  {
    cin>>arr[i];
  }
  cout<<"\nThe elements that you have entered are :";
  for(int i=0;i<size;i++)   //for 循环
  {
    cout<<arr[i]<<",";
  }
  delete arr; //删除现有数组。
  return 0;
}

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

C++ Memory Management

New运算符优势

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

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

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

检索技术核心20讲 -〔陈东〕

TensorFlow 2项目进阶实战 -〔彭靖田〕

Linux内核技术实战课 -〔邵亚方〕

技术管理案例课 -〔许健〕

Flink核心技术与实战 -〔张利兵〕

爆款文案修炼手册 -〔乐剑峰〕

朱涛 · Kotlin编程第一课 -〔朱涛〕

深入浅出分布式技术原理 -〔陈现麟〕

说透元宇宙 -〔方军〕

好记忆不如烂笔头。留下您的足迹吧 :)