内存泄漏与否?

时间:2012-08-26 12:09:08

标签: c++ arrays pointers memory-leaks

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

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

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

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:5)

这是未定义的行为。 The C++ standard says

  

3.7.4.2释放函数

     

3 ...否则,行为未定   如果标准库中提供给 operator delete(void*) 的值不是返回的值之一   之前在标准库中调用 operator new(std::size_t) operator new(std::size_t, const std::nothrow_t&) ,如果提供给 {的值,则行为未定义标准库中的{1}} 不是上次调用返回的值之一    operator delete[](void*) operator new[](std::size_t)   标准库。

     

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

答案 2 :(得分:1)

编译器不分配或删除内存,它依赖于操作系统,如果你在一个你没有从new获得的指针值上调用free会发生什么。唯一能保证的是它是错误的。