何时使用动态内存C ++

时间:2012-10-08 06:00:11

标签: c++ memory pointers dynamic

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

    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;
}

然而这对我来说很好,我一直以为我需要使用指针和新运算符。动态内存是否仅适用于您想要更改阵列大小,释放空间或控制何时释放内存的能力?感谢。

4 个答案:

答案 0 :(得分:8)

它工作正常,因为它是编译器允许的扩展名。它不是合法的C ++,我建议你避免它。为了帮助您避免它,我建议您使用-pedantic进行编译以将非标准扩展的使用标记为警告,并-Werror将警告视为错误。如果您不想将所有警告视为错误,请使用-pedantic-errors,只需警告此类型。

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

答案 1 :(得分:3)

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

std::vector<int> v;

for(int ii = 0; ii < n; ii++)
{
    v.push_back(ii);
}

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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