我已经阅读了这样一个例子,如果用正常数组{int p [i];}替换动态数组{p = new(nothrow)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;
}
答案 0 :(得分:3)
但是还有其他差异吗?
编译并运行它,看看会发生什么:
int main(int argc, char** argv){
char buffer[1024*1024*64];
buffer[0] = 0;
return 0;
}
说明:
好吧,普通数组放在堆栈上或代码段内(如果它是全局变量或静态局部变量)。至少在Windows / Linux PC上。堆栈的大小有限(虽然您可以使用linux中的ulimit和Windows上的编译器设置来更改它)。因此你的数组对于堆栈来说太大了,你的程序会在进入带有该数组的函数时立即崩溃(linux上的“分段错误”,“堆栈溢出”或Windows上的“访问冲突”(forgoet which))。 Windows(x86)上数组大小的默认限制为1兆字节,Linux上为8兆字节。
您无法确定使用new
分配的块的大小。 int *p = new int[146]; std::cout << sizeof(p) << std::endl
。将打印sizeof(int *),而不是已分配内存的大小。但是,sizeof
适用于数组。
理论上,使用动态内存分配,您可以根据需要分配尽可能多的内存(但操作系统可能会施加限制,而在32位系统上,最大分配的块大小将为2..3 GB)。您还可以通过释放内存来控制资源使用情况,这样您的程序就不会无缘无故地使用系统ram / swap文件。
动态数组不会自动释放,您手动delete
。
这只是一个简短的概述。
动态内存分配提供了更好的资源控制,并消除了局部变量的一些限制。
说到这一点,尽管您可以使用new
/ delete
,但如果您想使用大小可变的数组,则应使用std::vector
。手动内存管理容易出错,因此您应该尽可能让编译器为您完成。因此,建议至少研究STL(Standard Template Library),smart pointers,RAII,Rule of Three。
答案 1 :(得分:0)
动态就是这样。您可以在运行时而不是编译时更改结果数组的大小。有一些编译器扩展允许您像动态数组一样使用静态数组(int数组[CONSTANT]),因为您可以在运行时指定大小,但这些是非标准的。
动态数组也在堆上而不是堆栈上分配。这允许您在必要时使用所有可用内存来创建阵列。堆栈的大小有限,取决于操作系统。
在堆上分配内存允许您执行此操作:
int* createArray(int n) {
int* arr = new int[n];
return arr;
}
int main()
{
int* myArray = createArray(10);
// this array is now valid and can be used
delete[] myArray;
}
我确信动态阵列和静态阵列之间还存在许多其他复杂因素,但这些点是最重要的。