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
或Csmalloc
和free
进行分配),在引发异常时不会释放内存管理。如果需要使用此类函数,则应始终将内存管理嵌套在类的构造函数和析构函数中。当对象超出范围时,总是调用析构函数,因此没有内存泄漏
使用VLA和new
/delete
有一件事是无法快速调整大小。甚至std::vector
也不使用它。这是通过C函数realloc实现的,它试图保持缓冲区在适当的位置。当您需要它时,您可以轻松地设计一个类似std::vector
-的类,它应该在析构函数中调用free
。要销毁您调用的元素,element.~T()
,其中T
是element
的类型
然而,
std::vector
试图通过分配具有额外空间的缓冲区来提高调整大小的性能。这两种方法之间的主要区别在于,第一种方法从空闲存储区(堆)分配内存,第二种方法从堆栈分配内存。事实上,第二个是不好用的,因为与堆相比,堆栈内存的空间非常有限。显然,第一条语句返回指向分配内存中第一个元素的指针,而第二条语句返回数组本身第二个不是标准C++,它是编译器扩展(一些编译器支持)@ Gaurav Sahu,问题是什么?你能指定你的问题吗?第二个语法是有效的C而不是C++。这2种事物有不同的含义,C++构造被翻译成“int *ARR=(int *)Malc(sieof(int)* size))。C++构造不能直接翻译成C++。为什么不使用STD::vector STD::CODL>代码> ALOLACA< /C> >既不是标准C++也不是C语言。