以下が未定義の動作をもたらすというのは本当ですか:
void * something = NULL;
char * buffer = new char[10];
something = buffer;
buffer = NULL;
delete [] something; // undefined??
最初にキャストsomething
する必要がありchar *
ますか?
以下が未定義の動作をもたらすというのは本当ですか:
void * something = NULL;
char * buffer = new char[10];
something = buffer;
buffer = NULL;
delete [] something; // undefined??
最初にキャストsomething
する必要がありchar *
ますか?
はい。
標準から (5.3.5 削除):
delete のオペランドの値は、前の配列 new-expression から得られたポインター値でなければなりません。72) そうでない場合、動作は未定義です。[注: これは、削除式の構文が、new 式の構文ではなく、new によって割り当てられたオブジェクトの型と一致する必要があることを意味します。]
最初の選択肢 (オブジェクトの削除) では、オペランドの静的型がその動的型と異なる場合、静的型はオペランドの動的型の基本クラスであり、静的型は仮想デストラクタを持つか、動作が未定義です。 . 2 番目の選択肢 (配列の削除) では、削除するオブジェクトの動的な型がその静的な型と異なる場合、動作は未定義です*。
**これは、void 型のオブジェクトが存在しないため、void* 型のポインターを使用してオブジェクトを削除できないことを意味します。
はい、厳密にdelete[]
は、ポインターの静的型を使用する場合delete[]
、最初に割り当てた配列の型と一致する必要があります。そうしないと、未定義の動作が発生します。
通常、多くの実装では、実際には非自明なデストラクタを持たない型の配列であるa でdelete[]
呼び出されますが、保証されていません。void*
delete[] buffer
また
delete[] (char*)something
どちらも有効でしょう。