int length = 5;
int hi[length];
vs
int length = 5;
int *hi = new int[length];
有人告诉我,每当您尝试静态分配大小不恒定的数组时,编译器都会在 C 中抱怨。因此,如果您需要未知大小的数组,则需要动态分配内存。然而,现在有了允许第一个示例的编译器,它们到底在做什么?它们是否仍在数据段中,或者是否不在堆中?如果它们在堆上,那么这些示例之间有什么区别,为什么我仍然需要在第二个示例上调用delete[],而不是第一个示例?
然而,现在有了允许第一个示例的编译器,它们到底在做什么?它们是否仍在数据段中,或者是否不在堆中?如果它们在堆上,那么这些示例之间有什么区别,为什么我仍然需要在第二个示例上调用delete[],而不是第一个示例?
第一个声明是static变量(通常在堆栈上*)将die位于定义它的代码块的末尾。
第二个是动态分配一个变量(通常在堆上*),这意味着您可以决定在哪里释放它delete[]
(是的,你应该记住这样做)。
在数组上下文中,两者之间的主要区别在于,第二个数组可以通过取消分配它指向的内存(例如前一个数组)并使其指向仍然动态分配的新数组来轻松调整大小。
int* arr = new int[5];
[...]
delete[] arr;
arr = new int[10];
静态数组int hi[length]
通常声明一个const int*
不应该修改它。也就是说C++提供了一整套可以/应该用来代替数组的容器。
[*] 注意:C++ 标准没有指定在何处分配动态或静态内存。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)