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

标签 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);
}

我希望得到以下输出:

Message: Bar
Message: Foo
~Foo()

但实际上(代码是用 gcc 编译的)不打印 Message: Bar据我了解barMessage没有被正确销毁。为什么?

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

谢谢,

附言我已经知道已弃用 std::auto_ptr<>()用法:)

最佳答案

如果您通过指向基类对象的指针在派生对象上调用delete,那么您将得到未定义的行为 除非基类被声明为虚拟的。

当基类上的模板化 std::auto_ptr 拥有派生类对象时,它会超出作用域,当实际对象为派生类类型。

关于c++ - 为什么在 g++ 中缺少虚拟 d-tor 不会破坏派生类的堆栈分配成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9682886/

相关文章:

c++ - 我们什么时候必须在派生类c++中定义析构函数

c++ - 如何在gmock中指定连续返回?

c++ - 使用 boost-spirit 解析的大型结构

c++ - 构造函数和析构函数中的虚函数调用

c++ - 如果我将一个基类的析构函数从非虚拟更改为虚拟,会发生什么?

c++ - 错误 LNK2019 - 抽象类中的虚拟析构函数

c++ - 为什么 const 成员会导致错误?

c++ - 如何使用 gotoxy 函数代替 clrscr

android - 无法阻止 Eclipse 提示我已经修复的错误

c++ - "virtual"对 C++ 中的析构函数有何影响?