ピア コード レビュー セッション中に、次のようなコードを見ました。
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++ では、配列サイズの 1 つ前を指すことは問題ありませんが、アクセスすると未定義の動作が発生することを知っています。だから、最後の行*s++='\0'
は大丈夫だと思います。しかし、私の記憶が正しければ、C++ 標準では、返さdelete
れたのと同じポインターを提供する必要があると規定されています。new
これは、返されたポインターが改ざんされてはならないことを意味すると私は信じています。new
使用する可能性のある返されたアドレスの前にハウスキーピング情報を保持する可能性があるためだと思いdelete
ます。new
'd ポインターを移動すると、これにアクセスできなくなる可能性があります。
それは未定義の動作ですか、それとも実装定義または未指定ですか? 誰でもこれを確認できますか?できれば、C++ 標準の正しい場所を指すことによって。
ドラフト C++ 標準 (Draft_SC22-N-4411.pdf) の自由に利用できるドラフト バージョンでは、セクション 5.3.5 に詳細が記載されています。Bjarneさんのホームページから頂きました。