gpt4 book ai didi

数组的 C++ 内存分配

转载 作者:行者123 更新时间:2023-11-28 06:46:26 24 4
gpt4 key购买 nike

非常简单的问题,但我找不到答案:就内存分配而言,以下 2 个表达式在 C++ 中是否等效?

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

所以我想知道:无论我如何初始化数组,我总是必须删除它吗?或者我能以某种方式从范围界定中受益,并在堆栈上生成数组,当它们超出范围时,它们会在没有显式调用 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] .

就语法而言。现在,关于幕后发生的事情:

您的两个示例之间的区别在于 the first is allocated on the stack, the second on the heap .这意味着第一个一旦超出范围就会自动释放,但第二个直到 delete[] ptr_wide_array 才会被释放。被调用(或在从 ptr_wide_array 复制的另一个指针上)。这会带来内存泄漏的严重风险,尤其是当您开始使用异常时。一般来说,不要使用原始的 new在 C/C++ 中。使用 std::vector 等容器, 和 smart pointers .

[#] 参见this SO question有关数组和指针如何相关以及数组如何“衰减”为指针的解释。

关于数组的 C++ 内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24909753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com