例如,我有动态大小的阵列基于用户输入:在哪里创建动态大小数组? (堆栈或堆)
int n;
cin >> n;
int items[n];
这是阵列上堆分配?或者是它堆一样,如果我写:
int n, *items;
cin >> n;
items = new int[n];
...
delete [] items;
编辑:据我所知,第二个代码做什么。我问第一个代码是否像第二个代码一样执行相同的操作,但使用的行数较少。
例如,我有动态大小的阵列基于用户输入:在哪里创建动态大小数组? (堆栈或堆)
int n;
cin >> n;
int items[n];
这是阵列上堆分配?或者是它堆一样,如果我写:
int n, *items;
cin >> n;
items = new int[n];
...
delete [] items;
编辑:据我所知,第二个代码做什么。我问第一个代码是否像第二个代码一样执行相同的操作,但使用的行数较少。
你的第一个例子中没有使用动态数组在所有 - 它使用一个堆栈分配的变长数组(通常幕后相当于一个alloca
调用,除了sizeof
运算符),这是C99的一个功能,而不是C++。
你的第二个数组当然是通过new分配在堆上的。
请注意,标准C++不支持变长数组,因此第一个代码片段在C99(无'iostream's)和C++(无VLA)中都将是语法错误。不过,有些编译器支持C++中的VLA作为扩展。 – 2013-03-16 19:29:32
@Insilico是正确的,但许多C++编译器支持C99功能作为扩展(至少GCC,Clang,也许MSVC)。 – 2013-03-16 19:30:15
@Insilico我会在没有警告的情况下编译。用g ++进行测试,没有任何构建参数。 – kravemir 2013-03-16 19:32:47
您的第一个代码块将无法编译,您无法使用new或malloc/calloc/realloc分配一个动态大小的数组。
为了做你想做的事情,你需要做第二块中的东西,它总是分配在堆上。
Dynamic =堆。非动态=堆栈。
永远记得释放你的记忆!
真的吗? http://ideone.com/S67G18 – kravemir 2013-03-16 19:28:20
@Miro:它的工作原理是[可变长度数组](http://en.wikipedia.org/wiki/Variable-length_array)(这是第一个代码片段要求的)是[由GCC作为扩展支持](http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html)。它在标准C++中不受支持。 – 2013-03-16 19:32:14
请理解,问题的第一部分中显示的VLA是C99扩展,并且得到大多数现代编译器的支持。 – 2013-03-16 19:32:20
相关:http://stackoverflow.com/a/1169916/1141471 – sehe 2013-03-16 19:46:08