非常简单的问题,但我找不到答案:在内存分配方面,以下2个表达式在C ++中是否等效?
wchar_t wide_array[10];
wchar_t* ptr_wide_array = new wchar_t[10];
所以我想知道:无论我如何初始化它,我是否总是要删除数组?或者我可以通过某种方式从作用域中获益并在堆栈上生成数组而不会显式调用delete,因为它们超出了范围。当然,如果可能的话,还是值得使用范围,还是总是使用删除更安全?
答案 0 :(得分:1)
在C / C ++中,数组很容易将[#]衰减为指向其第一个元素的指针。所以*wide_array
和wide_array[0]
是一回事。事实上,wide_array[i]
实际上被定义为(或者,如果你愿意,是{al}的句法糖)。(wide_array + i)
。因此i[wide_array]
与wide_array[i]
的含义相同,这是混淆C / C ++代码的有趣方法(但从来没有这样做过!)。
因此,您的第二个示例也可以引用为ptr_wide_array[i]
。
就语法而言。现在,关于幕后发生的事情:
您的两个示例之间的区别在于the first is allocated on the stack, the second on the heap。这意味着第一个将在超出范围时自动释放,但在调用delete[] ptr_wide_array
之前(或从ptr_wide_array
复制的另一个指针),第二个将不会被释放。这会导致内存泄漏的严重风险,尤其是在您开始使用异常时。通常,不要在C / C ++中使用原始new
。使用std::vector
和smart pointers等容器。
[#]有关数组和指针如何相关以及数组如何“衰减”到指针的解释,请参阅this SO question。