为什么在g ++中缺少虚拟d-tor不会破坏派生类的堆栈分配成员?

bar*_*kin 0 c++ virtual-destructor

我有以下代码:

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);
}
Run Code Online (Sandbox Code Playgroud)

我期待以下输出:

Message: Bar
Message: Foo
~Foo()
Run Code Online (Sandbox Code Playgroud)

但实际上(代码编译gcc)不打印Message: Bar,因为据我所知barMessage,没有正确破坏.为什么?

AFAIK非虚拟d-tor仅影响派生类的dtor调用 - 它将永远不会被调用,但是派生类的堆栈分配成员呢?

谢谢,

PS我已经知道弃用了std::auto_ptr<>():)

CB *_*ley 5

如果delete通过指向基类对象的指针调用派生对象,则除非将基类的析构函数声明为虚拟,否则将获得未定义的行为 .

std::auto_ptr当拥有派生类对象时,让基类上的模板超出范围具有在实际对象属于派生类类型时对基类指针类型调用delete的效果.