为什么用虚拟析构函数调度std :: vector :: push_back段错误?

Ign*_*ant 0 c++ oop

我有以下课程:

class Thing
{
public:

  Thing() {};
  virtual ~Thing() {}
};


class MyOwnThing : public Thing
{
public:

  std::vector<int> m;

  MyOwnThing() {};

  void init()
  {
    m.push_back(0);
    m.push_back(0);
    m.push_back(0);
    m.push_back(0);
    m.push_back(0);
    m.push_back(0);
    m.push_back(0);
    m.push_back(0);
    m.push_back(0);
    m.push_back(0);
    m.push_back(0);
    puts("done");
  }
};
Run Code Online (Sandbox Code Playgroud)

到目前为止没有什么不寻常的,除了基类中的虚拟析构函数.现在,这就是我在main函数中所做的:

int main()
{
  MyOwnThing *t = (MyOwnThing *) new Thing(); // (1)
  t->init();
  delete t;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码在第二次调用时生成了一个很好的段错误push_back.如果我从中删除虚拟析构函数,一切都会顺利运行Thing.怎么了?

1)我怀疑这个演员可能是问题的根源.

Que*_*tin 9

MyOwnThing *t = (MyOwnThing *) new Thing();
Run Code Online (Sandbox Code Playgroud)

铸造的需要应该是红旗:一个Thing没有一个MyOwnThing.它甚至不具有一个std::vector<int>用于init()采取行动.

形式上,一旦从MyOwnThing非对象上调用该函数,就会触发UB MyOwnThing.行为随虚拟析构函数而变化的荒谬事实是一切都破裂的症状,因为你将一些任意的内存部分视为一个std::vector<int>.