3

所以我一直被告知,当你在编译时不知道数组的大小时,你应该使用动态内存。例如,用户需要输入数组的大小。

    int n;

cin >> n;

int array[n];

for(int ii = 0; ii < n; ii++)
{
    array[ii] = ii;
}

for(int ii = 0; ii < n; ii++)
{
    cout << array[ii] << endl;
}

然而,这对我来说很好,我一直认为我需要使用指针和 new 运算符。那么动态内存是否仅适用于您想要更改数组大小、释放空间或能够控制何时释放内存的情况?谢谢。

4

4 回答 4

8

它工作正常,因为它是编译器允许的扩展。它不是合法的 C++,我建议你避免使用它。为了帮助您避免这种情况,我建议您在编译时-pedantic将非标准扩展的使用标记为警告,并将-Werror警告视为错误。或者,-pedantic-errors如果您不想将所有警告都视为错误,只需将此类警告视为错误。

但这并不意味着您应该使用指针和new. 您应该改用std::vector. 或者可能是std::dequeor std::list,但仅用于非常特殊的目的。对于大多数通用动态数组,std::vector是选择。

于 2012-10-08T06:02:06.530 回答
3

首先,您使用的不是标准 C++。可变长度数组是一种语言扩展,因此不可移植。其次,您可以通过使用在幕后为您执行此操作的类来避免显式使用动态分配的内存,并自行处理内存管理。这种情况的明显示例是std::vector

std::vector<int> v;

for(int ii = 0; ii < n; ii++)
{
    v.push_back(ii);
}
于 2012-10-08T06:02:55.350 回答
0

在 C++ 中,数组用于静态存储。大小仅在编译时已知。在编译期间将分配一个恒定大小的空间。

通常,编译器不允许动态创建数组。您编写的代码是 C++ 的扩展,它允许动态创建数组。我更喜欢你用std::vector

于 2012-10-08T06:12:06.820 回答
0

编译时限制不仅适用于数组。

  1. C++ 中的所有类型都有编译时限制
  2. 新操作可以避免的原因是没有类型包含所有堆分配的数组元素 - 堆分配在类型系统之外
  3. sizeof(T) 记录了该功能,因为它的返回值始终是编译时常量。
  4. std::vector 可以避免这个问题,因为元素在 std::vector 的类型之外
于 2012-10-08T16:58:47.920 回答