内存泄漏与否

Memory leak or not?

本文关键字:泄漏 内存      更新时间:2023-10-16

我在较大代码的中间有一小段代码:

int *p = new int[100];
p += 50;
delete []p;

编译器是否只会从第 51位置删除内存?我认为确实如此。但是,在数组指针的情况下,编译器包含一个附加项,用于告知分配的对象数。那么,在这种情况下,它不应该继续删除超出分配大小的内存吗?或者它是否删除第 51 个 st–100元素并将第 1个 st50th 保留在内存中,在这种情况下可能会发生内存泄漏。

这实际上是未定义的行为。您只能delete/delete[]您从new/new[]中获得的内容。

这是未定义的行为。C++标准说:

3.7.4.2 释放函数

3 ...否则,行为是未定义的 如果提供给标准库中operator delete(void*)的值不是返回的值之一 通过先前调用标准库中operator new(std::size_t)operator new(std::size_t, const std::nothrow_t&),并且如果提供给标准库中operator delete[](void*)的值不是以前调用 operator new[](std::size_t)operator new[](std::size_t, const std::nothrow_t&) 标准库。

4 ...使用无效指针值的影响 (包括将其传递给释放函数(是未定义的。(在某些实现中,它会导致系统生成的运行时错误。

编译器不会分配或删除内存,如果调用不是从 new 获得的指针值,会发生什么取决于操作系统。 唯一可以保证的是它是错误的。