我有一小段代码,它在一个更大的代码中:
int *p = new int[100];
p += 50;
delete []p;
编译器只会删除第51个内存位置吗?我认为是的。然而,在数组指针的情况下,编译器会多持有一个项,用于告知分配的对象数量。所以,在这种情况下,它是否应该删除超出分配大小的内存?还是它会删除第51-100个元素,并将1-50个元素保留在内存中,这种情况下可能会发生内存泄漏。
我有一小段代码,它在一个更大的代码中:
int *p = new int[100];
p += 50;
delete []p;
编译器只会删除第51个内存位置吗?我认为是的。然而,在数组指针的情况下,编译器会多持有一个项,用于告知分配的对象数量。所以,在这种情况下,它是否应该删除超出分配大小的内存?还是它会删除第51-100个元素,并将1-50个元素保留在内存中,这种情况下可能会发生内存泄漏。
这实际上是未定义的行为。你只能 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
和delete
能否提供更多保证,或者说即使delete
的实现可以从结构体内部恢复指针,标记为“未定义行为”是否意味着编译器也可能搞砸它?在我看来,它确实可能会搞砸(毕竟是未定义的,不是未指定的),我想知道是否有任何编译器具有逻辑,实际上会导致出错; 我知道某些编译器能够省略 malloc
/ free
调用对,当缓冲区未使用时,因此它们肯定在这些领域辛苦。 - Matthieu M.malloc
和new
)。通过一些魔法,new
可以被用户覆盖。 - Matthieu M.