c+中的动态数组声明+; 我已经看到了两种在C++中声明动态数组的方法。一种是通过使用新的操作员: int *arr = new int [size];

c+中的动态数组声明+; 我已经看到了两种在C++中声明动态数组的方法。一种是通过使用新的操作员: int *arr = new int [size];,c++,arrays,dynamic,declaration,C++,Arrays,Dynamic,Declaration,另一种是直接声明: int arr[size]; 注意:这里请注意,size是一个变量,其值将由用户在运行时提供。 问题是:在C++中,声明动态数组的最好方法是什么?< /p> < p>假设你的问题是“什么更好?” 第二个是直接创建数组,在堆栈上创建数组,第一个在堆上。第二种称为可变长度数组(VLA),它是非标准C++,不可移植,但在C语言中是标准的。GNU C++编译器支持这一点,但其他编译器不支持。在内部,通过扩展堆栈框架的alloca(POSIX)/\uuuuu内置alloca(GNU)

另一种是直接声明:

int arr[size];
注意:这里请注意,size是一个变量,其值将由用户在运行时提供。
问题是:在C++中,声明动态数组的最好方法是什么?< /p> < p>假设你的问题是“什么更好?” 第二个是直接创建数组,在堆栈上创建数组,第一个在堆上。第二种称为可变长度数组(VLA),它是非标准C++,不可移植,但在C语言中是标准的。GNU C++编译器支持这一点,但其他编译器不支持。在内部,通过扩展堆栈框架的
alloca
(POSIX)/
\uuuuu内置alloca
(GNU)分配阵列。可变长度数组可能会以较大的大小破坏堆栈(可能会产生SIGSEGV,但也可能损坏其他数据),而新操作符会抛出一个可捕获的异常。(但是,使用递归函数也会以同样的方式破坏堆栈…)。当您知道VLA的尺寸相对较小时,使用VLA并不是一种坏的做法。当需要多次分配阵列时(VLA的分配比堆上的分配快),VLA甚至可以提高性能。由于VLA位于堆栈上,因此它不需要
空闲
d/
删除
d,当函数退出时,它会自动释放。 这适用于GNU编译器:VLA确实会在销毁时调用析构函数,但是分配给
alloca
/
\uuuuuu内置\uAlloca
的内存将在函数末尾释放,就像释放给
free
的内存一样(分配给
malloc

作为结论,我认为对于大多数问题,使用
new
进行分配更好。但是VLA适合在本地函数中快速分配内存。没有可移植的方法从函数返回VLA(无需通过汇编进行黑客攻击)(可以从函数返回大小恒定的数组,但需要在签名中指定)。为此,有
std::array
std::vector
,我建议使用它来代替手工内存管理(使用
new
delete
或Cs
malloc
free
进行分配),在引发异常时不会释放内存管理。如果需要使用此类函数,则应始终将内存管理嵌套在类的构造函数和析构函数中。当对象超出范围时,总是调用析构函数,因此没有内存泄漏

使用VLA和
new
/
delete
有一件事是无法快速调整大小。甚至
std::vector
也不使用它。这是通过C函数realloc实现的,它试图保持缓冲区在适当的位置。当您需要它时,您可以轻松地设计一个类似
std::vector
-的类,它应该在析构函数中调用
free
。要销毁您调用的元素,
element.~T()
,其中
T
element
的类型


然而,
std::vector
试图通过分配具有额外空间的缓冲区来提高调整大小的性能。

这两种方法之间的主要区别在于,第一种方法从空闲存储区(堆)分配内存,第二种方法从堆栈分配内存。事实上,第二个是不好用的,因为与堆相比,堆栈内存的空间非常有限。显然,第一条语句返回指向分配内存中第一个元素的指针,而第二条语句返回数组本身代码> ALOLACA< /C> >既不是标准C++也不是C语言。