我在同行代码评审会议期间看到了如下一些代码:
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++ 标准中的正确位置。
In the freely available draft version of the draft C++ Standard (Draft_SC22-N-4411.pdf) has the details in section 5.3.5. I got it from Bjarne's homepage.
来自 C++ 标准,第 5.3.5/2 节:
删除操作数的值应为指针值
这是由先前的数组产生的
新表达。如果不是,则行为
未定义
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)