在同行代码审查会议期间,我看到了如下一些代码:
char *s = new char[3];
*s++ = 'a';
*s++ = 'b';
*s++='\0';
delete []s; // this may or may not crash on some or any day !!
首先,我知道在标准 C++ 中,指向过去的数组大小是可以的,尽管访问它会导致未定义的行为。所以我相信最后一行*s++='\0'
很好。但如果我没记错的话,C++ 标准要求delete
应该提供与new
返回相同的指针。
我相信这意味着返回的指针不能被篡改。我想这是因为可能会在可能使用new
的返回地址之前保留一些家政信息。delete
移动new
'd 指针可能会使其无法访问。
它是未定义的行为还是实现定义的或未指定的?任何人都可以确认这一点吗?最好通过指向 C++ 标准中的正确位置。
在免费提供的 C++ 标准草案 (Draft_SC22-N-4411.pdf) 的草案版本中,详细信息在第 5.3.5 节中。我是从 Bjarne 的主页上得到的。