我是初学者。我对它们之间的区别感到困惑。我读过一些答案,并意识到区别之一是动态数组可以被删除,而普通数组则不能。但还有其他差异吗?比如它们的功能、尺寸等等?
好吧,我读过这样一个例子,如果我用普通数组 {int p [i];} 替换动态数组 {p= new (nothro) int[i];} ,我没有看到任何区别。
#include <iostream>
#include <new>
using namespace std;
int main ()
{
int i,n;
int * p;
cout << "How many numbers would you like to type? ";
cin >> i;
p= new (nothrow) int[i];
if (p == 0)
cout << "Error: memory could not be allocated";
else
{
for (n=0; n<i; n++)
{
cout << "Enter number: ";
cin >> p[n];
}
cout << "You have entered: ";
for (n=0; n<i; n++)
cout << p[n] << ", ";
delete[] p;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但还有其他差异吗?
编译并运行它,看看会发生什么:
int main(int argc, char** argv){
char buffer[1024*1024*64];
buffer[0] = 0;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
解释:
那么,普通数组要么放置在堆栈上,要么放置在代码段内(如果它是全局变量或静态局部变量)。至少在 Windows/Linux PC 上是这样。堆栈的大小有限(尽管您可以使用 Linux 中的 ulimit 和 Windows 上的编译器设置来更改它)。所以你的数组对于堆栈来说太大了,你的程序在进入带有该数组的函数时会立即崩溃(Linux 上的“分段错误”,Windows 上的“堆栈溢出”或“访问冲突”(忘记哪一个))。数组大小的默认限制在 Windows (x86) 上为 1 兆字节,在 Linux 上为 8 兆字节。
您无法确定分配的块的大小new。int *p = new int[146]; std::cout << sizeof(p) << std::endl。将打印 sizeof(int*),而不是分配的内存大小。但是,sizeof适用于数组。
理论上,使用动态内存分配,您可以根据需要分配尽可能多的内存(不过,操作系统可能会施加限制,在 32 位系统上最大分配块大小将为 2..3 GB)。您还可以通过释放内存来控制资源使用,这样您的程序就不会无缘无故地占用系统内存/交换文件。
动态数组不会自动释放,您需要delete手动释放它们。
这只是一个简短的概述。
动态内存分配提供了更精细的资源控制并消除了局部变量的一些限制。
说到这里,虽然你可以使用new/ delete,但如果你想使用可变大小的数组,你应该使用 / std::vector。手动内存管理很容易出错,因此您应该尽可能让编译器为您执行此操作。因此,建议至少学习一下STL(标准模板库)、智能指针、RAII、三法则。