2013-06-24 3 views
5

をキャストすると、私は次のコードのようななめらかを使用することができます:オペレータは、削除して

int main() 
{ 
    int* foo = new int; 
    double* bar = reinterpret_cast<double*>(foo); 
    delete bar; 
} 

それはUBですか?

operator newが返すポインタに対してoperator deleteを呼び出す必要があると思いますが、この場合はキャストはどうですか?

私は、reinterpret_castが結果のポインタについて何らの保証もしていないので、UBだと思います。私は正しい?

誰かが標準から正しい見積りを投稿できますか?

+2

ここでは、UBは削除式であり、演算子の削除ではないことに注意してください。 – PlasmaHH

+0

ここでUBはどうですか?標準から見積もりを投稿できますか? – FrozenHeart

答えて

6

§5.3.5/ 2 "最初の代替(削除オブジェクト)では、 の値はnullポインタ値、 へのポインタである可能性があります。以前のnew-式 オブジェクトの基本クラスを表すサブオブジェクト(1.8)へのポインタ オブジェクト(10)。そうでない場合、動作は未定義です。 bardoubleを指しているため、以前のnew-expression(intを作成したもの)によって作成されたオブジェクト を指しません。

+0

この場合、静的タイプと動的タイプは何ですか? – FrozenHeart

+0

それぞれ 'int'と' double'です。しかし、標準の文言が理解するにはあまりに複雑であっても、あなたがしていることで間違ったコンストラクタを呼び出すことを考慮してください。これは上記の引用がなくても明らかです。両方のデストラクタはそれが起こると自明なので、 "うまくいく"が、それはまだ非常に明らかにUBです。 – Damon

+0

@NikitaTrophimovその他の情報:http://stackoverflow.com/questions/1347691/static-vs-dynamic-type-checking-in-c – chris

0

ここでは、次のとおり

5.3.5点3:第一の代替では(オブジェクトの削除)、削除されるオブジェクトの静的な型は静的タイプ、その ダイナミック型と異なる場合削除されるオブジェクトの動的型の基底クラスとし、 静的型は仮想的なデストラクタを持たなければならないか、その振る舞いは未定義です。静的および動的な型が何であるかの質問については

1.3.7ダイナミック型(glvalue)最も派生オブジェクトの
タイプ(1.8)これにglvalueで表さglvalue式を参照する [例:静的型が「クラスBへのポインタ」であるポインタ(8.3.1)pが、B(句10)から派生したクラス Dのオブジェクトを指している場合、式* pは "D"である。参考文献(8.3.2)は同様に として扱われる。 -end例]実行セマンティクス を考慮することなく、プログラムの解析から得られた式(3.9)の

1.3.23スタティック型
タイプ[注:式の静的な型のみプログラムの形式に依存します式 が表示され、プログラムの実行中は変更されません。 5.3.5-3から末端音符]

+0

また。 (それは実際に私が答えを見つけたときに私が探していた段落です) –

+0

この場合の静的および動的タイプは何ですか? – FrozenHeart

+1

静的型はポインタの型( 'double')です。動的型はpointeeの型( 'int')です。 –

2

最初の選択肢では(オブジェクトを削除する)、 オブジェクトの静的な型を削除する場合は、そのダイナミック型とは異なりますstatic タイプは、オブジェクトの動的タイプの基本クラスであり、 が削除され、静的タイプは仮想デストラクタを持つか、または ビヘイビアーは未定義です。

ここでreinterpret_castを使用する際に問題を残しておきますが、タイプが一致しないためUBです。いくつかの重要な型を想像してください。そして、あなたは "間違った" dtorが呼び出されるのを見ることができます。

さらに、キャスト以外の目的のためにreinterpret_castの結果を使用すると、ほとんどの場合、規格では指定されません。

+0

この場合、静的タイプと動的タイプは何ですか? – FrozenHeart

+1

@NikitaTrophimov:オブジェクトはint型であり、式の静的型はdouble型であるため、オブジェクトの動的型はint型です。 – PlasmaHH

+0

あなたは他の回答からの人とは異なる意見を持っています:) – FrozenHeart

関連する問題