Int *array = new Int [n];这个函数到底在做什么

int *array = new int[n]; what is this function actually doing?

本文关键字:Int 函数 什么 array new      更新时间:2023-10-16

我对如何创建一个动态定义的数组感到困惑:

 int *array = new int[n];

我不知道这是在干什么。我能看出它创建了一个名为array的指针指向一个新对象/数组int?有人能解释一下吗?

new分配存储请求的对象/数组所需的内存量。在本例中,n个int.

指针然后将地址存储到该内存块中。

但是要注意,这个分配的内存块不会被释放,除非你通过写

告诉它。
delete [] array;
int *array = new int[n];

声明了一个指针,指向一个动态数组,类型为int,大小为n

一个更详细的答案:new分配的内存大小等于sizeof(int) * n字节,并返回由变量array存储的内存。此外,由于使用new动态分配内存,您应该通过写入(当然,当您不再需要时)手动释放内存:

delete []array;

否则,您的程序将泄漏至少sizeof(int) * n字节的内存(可能更多,取决于实现使用的分配策略)。

语句的基本操作如下:

  1. 创建包含'n'个元素的整数数组
  2. 在使用new操作符创建指针
  3. 时,在进程的HEAP内存中分配内存
  4. 返回一个有效的地址(如果所需大小的内存分配在执行此语句时可用)

它在堆上分配的空间等于大小为N的整数数组,并返回一个指向它的指针,该指针被赋值给一个名为"array"的int*类型指针

new操作符正在为n整数块分配空间,并将该块的内存地址分配给int*变量array

new在一维数组中的一般形式如下:

array_var = new Type[desired_size];

它根据n的值分配相应的空间指针将指向数组即数组的第一个元素

int *array = new int[n];

在C/c++中,指针和数组(几乎)是等价的。int *a; a[0];将返回*a, a[1];将返回*(a + 1)

但是数组不能改变它所指向的指针,而指针可以。

new int[n]将为"array"分配一些空间

从c++ 11开始,执行此操作的内存安全方法(仍然使用类似的结构)是使用std::unique_ptr:

std::unique_ptr<int[]> array(new int[n]);

这创建了一个智能指针,指向一个足够大的内存块,可以容纳n整数,当它超出作用域时自动删除自己。这种自动清理是很重要的,因为它避免了代码提前退出并且永远达不到delete [] array;语句的情况。

如果你需要一个能够动态调整大小的数组,另一个(可能是首选的)选项是使用std::vector。当您需要未知数量的空间时,这很好,但它有一些缺点(添加/删除元素的时间不恒定)。您可以创建一个数组并向其中添加元素,例如:

std::vector<int> array;
array.push_back(1);  // adds 1 to end of array
array.push_back(2);  // adds 2 to end of array
// array now contains elements [1, 2]