隐藏内存分配?

时间:2017-11-21 17:04:07

标签: c++ c arrays c++11 memory-management

我知道在C99中你可以声明一个数组,其大小是参数的值,如下所示:

void foo(int size) {
  int array[size];
  // do stuff
}

根据我的理解,它在调用函数时被分配在堆栈上。显然这不适用于C ++。

最近我在C ++中写了这样的东西:

void bar(vector<Thing> vec) {
  for (Thing t : vec) {
    int n = t.get_n();
    int array[n];
    // do stuff
  }
}

令人惊讶的是,编译器(G ++)没有抱怨,为什么? 那里有隐藏的内存分配吗?

2 个答案:

答案 0 :(得分:4)

可变长度数组不是C ++标准的一部分。它是G ++提供的扩展。

如果你用-pedantic标志编译它,那么编译器会发出警告。

答案 1 :(得分:3)

Gcc默认允许C ++中的可变长度数组(又称VLA),即使它不符合标准。

如果您通过传递(例如)-std=c++14选项告诉它严格遵守标准,那么它将正确拒绝您的代码。