delete和delete[]是如何实现的?

Jer*_*ang 2 c++ memory-management new-operator

当我用来new []申请内存时。最后,我用来delete释放内存(不是delete[])。这会导致内存泄漏吗?

两种类型:

  1. 内置类型,例如int, char, double...
    我不确定。
  2. 类类型。

我认为可能会免费泄漏。因为有析构函数。

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

如何delete实施delete[]

Nic*_*las 5

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

调用deleteby 分配的内存new[]可能会导致堆损坏,从而导致应用程序崩溃。当然,不是立即,因为那太有用了。它会在稍后的某个时间崩溃,在堆被损坏很久之后,几乎无法追踪。

始终delete[]与 一起使用new[]。事实上,从一开始就没有使用过。new[]std::vector除非您有非常特殊和特定的需求,否则请使用 a 。

我想知道为什么?

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

不过,如果你坚持要理由的话……

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

另请注意,这不需要delete[]计数。呃……这怎么可能?如果你分配 50秒,显然需要知道你分配了多少,对吗?但你不必告诉它;它自动知道。intdelete

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

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

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