У меня есть следующий код:
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 AFAIK влияет только на вызов dtor производного класса - он никогда не будет вызван, но как насчет членов, выделенных из стека производного класса?
Спасибо,
P.S. Я уже знаю об устаревшем std::auto_ptr<>()
использовании:)