gpt4 book ai didi

c++ - delete 和 delete[] 是如何实现的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:28:04 27 4
gpt4 key购买 nike

当我使用 new [] 申请内存时。最后,我使用 delete 来释放内存(不是 delete[])。会不会造成内存泄漏?

两种类型:

  1. 内置类型,如 intchardouble ...
    我不确定。
  2. 类类型。

我认为可能会免费泄漏。因为 destruct 函数。

很多人和一些书告诉我,new[] -> delete[]新建 -> 删除
我想知道为什么。于是查了vs2010的源码,肯定是用了内存池机制。它又长又复杂。我无法继续阅读。

deletedelete[] 是如何实现的?

最佳答案

这不是内存泄漏;这是未定义的行为。那更糟。

new[] 分配的内存上调用 delete 会导致堆损坏,从而使您的应用程序崩溃。当然不是马上,因为那太有用了。稍后它会崩溃,在堆已损坏以致几乎无法追踪很久之后。

始终使用 delete[]new[]。实际上,永远不要使用 new[] 作为开头。除非您有非常特殊和特定的需求,否则请使用 std::vector

I want to know why ?

为什么重要?这是错误的,会导致程序损坏。这是错误的,因为 C++ 标准是这么说的。

但是,如果你硬要有理由...

请注意,您可以使用 new[] 分配任意数量的项目。您可以在那里放置任何计数(又名:正整数)。所以你可以有 new int[50]new int[someIntegerVariable]。一切都很好。

另请注意,delete[] 进行计数。嗯……这怎么可能?如果你分配了 50 个 int,显然 delete 需要知道你分配了多少,对吧?但是您不必告诉它;它会自动知道。

如何?因为 new int[50] 分配的更多 而不仅仅是 50 个 int 的数组。它还分配足够的空间来容纳分配的大小。可以将其视为分配 51 个 int,但只允许您使用其中的 50 个。

然后,delete[] 出现了。它找出在哪里可以找到 new[] 分配的计数。它使用该计数来释放内存。

delete 不会这样做。因此,它无法正确地释放内存。

关于c++ - delete 和 delete[] 是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9858636/

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