Sim*_*onC 2 c++ dynamic-memory-allocation
考虑以下代码片段:
void foo() {
int arraySize = getMyComputedValue();
int dynamicArray[arraySize];
fillDynamicArray(&dynamicArray[0]);
for (int i = 0; i < arraySize; i++) {
// Do something with data
}
}
void bar() {
int arraySize = getMyComputedValue();
int* dynamicArray = new int[arraySize];
fillDynamicArray(dynamicArray);
for (int i = 0; i < arraySize; i++) {
// Do something with data
}
delete[] dynamicArray;
dynamicArray = NULL;
}
Run Code Online (Sandbox Code Playgroud)
两者都在内存中创建一个包含整数的不同长度的动态区域。我发现第一个示例foo()(至少在我的构建环境中)只能使用 GCC 进行编译。
两者之间的确切区别是什么?第一个示例仅仅是一个 GNU 扩展,它是底部示例的简写,允许编译器确定取消分配的正确时间是什么时候?或者第一个例子是否完全按照代码说的那样在堆栈上分配内存?
foo() allocates the memory on the stack, bar() allocates it on the heap. This has two effects: Lifetime (stack memory is automatically reclaimed at function exit), and max array size (stack space is rather limited to a range of a few MB at most, heap space is only limited by available RAM).
foo()是有效的 C99,但不是任何标准的 C++。C++ 根本就没有接受 VLA。这是您需要意识到 C 和 C++ 是两种截然不同的语言的核心点。有非 C++ 的有效 C 程序(如foo()),也有非 C 的有效 C++ 程序(如bar())。C++ 不再是它开始时的严格超集。
然而,编译器可以选择实现语言的超集作为扩展。g++这样做,但是如果您使用严格的 C++ 标准合规性 ( g++ -std=c++14 -pedantic -Werror) 进行编译,甚至g++会在foo().