在 VC++ 中创建无需"new"的动态数组

Creating dynamic arrays without "new" in VC++

本文关键字:new 动态 数组 VC++ 创建      更新时间:2023-10-16

我想在Visual Studio中创建一个数组,因为它在C99中是可能的:

int function(int N)
{
    int x[N];
    return 1;
};

但即使是VS2013也不支持这一点。有没有另一种方法(除了使用 new 和 delete)来创建x而无需在翻译时修复 N?谢谢!

在C++中这样做的宽容方法是使用向量

#include <vector>
int function(int N)
{
    std::vector<int> x(N);
    return 1;
};

如果你知道 N 不会很大(而且因为你似乎希望在堆栈上这个内存,无论如何),你可以使用 _alloca ,这是一个 C 函数。请参阅此处的文档。

#include <malloc.h>
int function(int N)
{
    int *x = _alloca(sizeof(int)*N);
    return 1;
};

这并不真正推荐,并且已被 _malloca 取代,这需要在您完成内存后调用 _freea

请注意,当函数退出时,两个版本都会释放内存,但第一个版本将在堆上分配内存,而第二个版本将在堆栈上分配(因此对N的上限要严格得多)。除了 std::vector 类的便利性和低开销之外,在 C++ 程序中使用 C 样式指针无论如何都是一种缺点。:)

为了在堆栈上定义C++数组(即没有new),必须在编译时知道它的大小,例如const int或预处理器宏。由于在这种情况下不是这种情况,因此您可以改用以下内容:

#include <vector>
using namespace std;
// ...
int function(int n)
{
    vector<int> x (n);
    return 1;
}

C++ 的堆栈中没有这样的可能定义可变长度数组。但是你可以使用 std::vector 代替,尽管它会在堆中分配内存。