掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
デストラクタを仮想関数にしたとき動き(2) (ID:68525)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> MSVS2008 や MSDev6.0 で落ちる理由が知りたいのですから。 単なる知的好奇心で知りたいだけかもしれないので、多分以下が理由じゃないかな、 と言ってみます。 1. Aには一切virtualな関数がない場合、vtblを先頭に持ってくるために Bのインスタンスは以下の様な構造になる。 Bのインスタンス +- vtbl +- 部分オブジェクト(A) +- Bの残りメンバ 2. この結果、部分オブジェクトAのアドレスはoperator new()で得られたアドレス ではなくなる。 3. A*型のままdeleteすると、2でずれたアドレスをoperator delete()に渡して しまい、メモリ管理機構が混乱する。 ただし、仕事等で理由を説明しなければならないとしたら、下手に落ちる理由を説明 するよりも、 - 問題のコードは間違っているコード。何が起こっても不思議ではない。 - そして今回は「たまたま」落ちるという結果になっただけ。 その理由を詮索するのは無意味。 という点をきちんと説明する方がかえって正しい姿勢だと思います。 (もしこの理由について説明している文書がなければ。 --「未定義」の場合、 そのような文書を作る義務がない(そして大抵作られていない)ことに注意) 今回とは違うケースですが、未定義の挙動についての質問と回答がC FAQに あります。参考までに。 http://www.kouno.jp/home/c_faq/c3.html#3 http://www.kouno.jp/home/c_faq/c11.html#33
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.