数组的c++内存分配

C++ memory allocation for arrays

本文关键字:分配 内存 c++ 数组      更新时间:2023-10-16

真的很简单的问题,但我找不到答案:在内存分配方面,以下2个表达式在c++中等效吗?

wchar_t wide_array[10];
wchar_t* ptr_wide_array = new wchar_t[10];

所以我想知道:我是否总是必须删除数组,无论我如何初始化它?或者我可以从作用域中获益,在堆栈上生成数组,当它们超出作用域时,不需要显式调用delete就会死亡。当然,如果可能的话,是否值得使用作用域,还是总是使用delete更安全?

在C/c++中,数组[#]很容易衰变成指向其第一个元素的指针。所以*wide_arraywide_array[0]是一样的。事实上,wide_array[i]实际上被定义为(或者,如果你愿意,它是(wide_array + i)的语法糖)。以至于i[wide_array]wide_array[i]的意思是一样的,这是一种有趣的混淆C/c++代码的方式(但从来没有这样做过!)。

所以你的第二个例子也可以被引用为ptr_wide_array[i]

语法到此为止。现在,至于幕后发生了什么:

两个示例之间的区别在于,第一个是在堆栈上分配的,第二个是在堆上分配的。这意味着一旦第一个指针超出作用域,它将自动被释放,但是第二个指针直到delete[] ptr_wide_array被调用(或者在从ptr_wide_array复制的另一个指针上)才会被释放。这将带来严重的内存泄漏风险,特别是当您开始使用异常时。一般来说,不要在C/c++中使用原始的new。使用容器,如std::vector和智能指针。

[#]关于数组和指针的关系以及数组如何"衰减"为指针的解释,请参见这个问题。