次のコードがあります。
struct Message
{
explicit Message(const std::string& message) : selfMessage(message) {};
~Message() { std::cerr << "Message: " << selfMessage << std::endl; }
const std::string selfMessage;
};
struct Foo
{
Foo() : fooMessage("Foo") {}
/// Destructor here is left intentionally non-virtual !!!
~Foo() { std::cerr << "~Foo" << std::endl; }
Message fooMessage;
};
struct Bar : Foo
{
Bar() : barMessage("Bar") {}
~Bar() { std::cerr << "~Bar" << std::endl; }
Message barMessage;
};
int main()
{
std::auto_ptr<Foo> foo(new Bar);
}
次の出力が期待されます。
Message: Bar
Message: Foo
~Foo()
しかし、実際には (コードは でコンパイルされます) は、正しく破壊されていないことを理解している限り、gcc
印刷されません。なんで?Message: Bar
barMessage
私の知る限り、非仮想 d-tor は派生クラスの dtor の呼び出しにのみ影響します。呼び出されることはありませんが、派生クラスのスタック割り当てメンバーはどうですか?
ありがとうございました、
PS私はすでに非推奨の使用法について知っていstd::auto_ptr<>()
ます:)