我在一个更大的代码中间有一小段代码:
int *p = new int[100];
p += 50;
delete []p;
编译器是否只删除51 st 位置的内存?我认为确实如此。但是,在数组指针的情况下,编译器会保存一个附加项,该项指示已分配的对象数。那么,在这种情况下,是否应该继续删除超出分配大小的内存? 或者它是否删除了51 st -100 th 元素并将1 st -50 th 保留在内存中,在这种情况下可能发生内存泄漏。
答案 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会发生什么。唯一能保证的是它是错误的。