让我们假设以下代码:
int* ptr = new int[10];
...
...
ptr += 2;
delete[] ptr;
ptr = NULL;
当调用delete时,ptr是否应该指向数组的第一个元素?
答案 0 :(得分:3)
如果您对delete
取消的某些内容发出new
,那就是未定义的行为。
因此以下代码的结果未定义:
int* ptr = new int[10];
ptr += 2;
delete[] ptr;
让我们看看标准:
C ++ 2011.第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&)
返回的值之一,则行为未定义。