是否在堆上分配了具有运行时长度的 C 样式数组?[C++][复制]

Are C-style arrays with the run-time length allocated on the heap? [C++] [duplicate]

提问人:Toxa 提问时间:10/19/2023 最后编辑:trincotToxa 更新时间:11/11/2023 访问量:77

问:

我知道 C++ 中的固定大小数组在堆栈上分配,并且我知道使用 new[] 关键字创建的动态大小数组将在堆上分配。

但请考虑以下代码片段:

std::cout << "Enter a length of the array: "
int length{};
std::cin >> length;

int arr[length]{};

for (int i{ 0 }; i < length; ++i)
{
    arr[i] = i;
    std::cout << arr[i] << ' ';
}
std::cout << '\n'

它编译没有问题。那么,我假设这些数组隐式放置在堆上是对的吗?如果是这样,它是如何工作的,这个数组使用的内存是否也在隐式释放后释放?

C++ 堆内存 堆栈内存

评论

3赞 Ben Voigt 10/19/2023
“我假设这些数组隐式放置在堆上是对的吗?”不。您需要查阅提供此功能的特定编译器的文档,因为 C++ 中不允许这样做。
2赞 user12002570 10/19/2023
int arr[length]{};不是标准的 C++。一些编译器具有允许这样做的扩展。
1赞 Pepijn Kramer 10/19/2023
为什么你如此热衷于在 C++ 中使用“C”样式数组?使用 std::array/std::vector 它们的行为更像对象(易于从函数返回,可以通过 const& 传递并且没有指针衰减)。对于堆栈分配的数组,使用 std::array,对于堆分配的数组,使用 std::vector,就这么简单(并且让代码的读者清楚你的意图是什么)。
0赞 user12002570 10/19/2023
查看 dupe GCC 如何在堆栈上创建一个数组,而其大小不由常量变量给出? 还有编译器扩展
0赞 HolyBlackCat 10/19/2023
它们应该最终出现在堆栈上。

答:

2赞 Dietrich Epp 10/19/2023 #1

这不是标准的 C++。

您使用的编译器支持同一文件中的 C 和 C++ 功能的混合。对可变长度数组的支持是 C 的一项功能。

可变长度数组通常存储在堆栈上。这或多或少等同于使用 分配数组。alloca()

(我建议避免使用可变长度的数组。由于它们不是 C++ 的一部分,因此它们可能与某些 C++ 功能交互不佳,并且大多数 C++ 编译器根本不支持它们。您可能希望改用。std::vector

评论

0赞 Toxa 10/19/2023
谢谢你的回答!这就解释了。