delete []提供了一个修改过的new-ed指针.未定义的行为?

Abh*_*hay 5 c++ memory-management standards-compliance new-operator

在对等代码审查会话期间,我看到了如下代码:

char *s = new char[3];
*s++ = 'a';
*s++ = 'b';
*s++='\0';
delete []s; // this may or may not crash on some or any day !!
Run Code Online (Sandbox Code Playgroud)

首先,我知道在标准C++中,指向一个过去的数组大小是可以的,但访问它会导致未定义的行为.所以我相信最后一行*s++='\0'很好.但是,如果我没记错的话,C++标准规定delete应该提供new返回的相同指针.

我相信这意味着返回的指针不得被篡改.我想这是因为new可能会在返回的地址之前保留一些内务信息delete.移动new'd指针可能会使其无法访问.

是未定义的行为还是实现定义或未指定?有谁能确认一下吗?最好是指向C++标准中的正确位置.

C++标准草案(Draft_SC22-N-4411.pdf)的免费草案版本的详细内容见5.3.5节.我是从Bjarne的主页上得到的.

小智 17

从C++标准,第5.3.5/2节:

delete的操作数的值应该是由前一个数组new-expression产生的指针值.如果不是,则行为未定义