c++ 我可以’删除[]’指向分配的数组的指针,但不是开始吗?

我想知道以下情况(我在一些代码中发现我需要使用):

SomeClass *ar = new SomeClass[2];
ar++;
delete[] ar;

该代码似乎工作正常 – 即不崩溃(win32,使用VS2005构建)。

这是“合法”吗?这当然不是正确的。

不,未定义通过任何地址删除,没有返回新的。
这是标准的引用。

§3.7.4.2-3

如果通过抛出异常终止释放功能,行为是未定义的。提供给解除分配函数的第一个参数的值可以是空指针值;如果是,如果解除分配功能是标准库中提供的功能,则该调用不起作用。否则,提供的值
在标准库中的operator delete(void *)应该是先前调用的操作符new(std :: size_t)或operator new(std :: size_t,const std :: nothrow_-t&)返回的值之一,在标准库中,标准库中提供给operator delete [](void *)的值应为先前调用的运算符new [](std :: size_t)或
在标准库中的operator new [](std :: size_t,const std :: nothrow_t&)。

翻译自:https://stackoverflow.com/questions/6420329/can-i-delete-a-pointer-that-points-into-an-allocated-array-but-not-to-the-s

转载注明原文:c++ 我可以’删除[]’指向分配的数组的指针,但不是开始吗?