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

时间:2016-12-29 14:41:26

标签: c++ oop

我有以下课程:

SynchronousQueue

到目前为止没有什么异常,除了基类中的虚析构函数。现在,这就是我在主要功能中所做的:

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");
  }
};

上面的代码在第二次调用int main() { MyOwnThing *t = (MyOwnThing *) new Thing(); // (1) t->init(); delete t; return 0; } 时生成了一个很好的段错误。如果我从push_back中删除虚拟析构函数,一切都会顺利运行。怎么了?

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

1 个答案:

答案 0 :(得分:9)

MyOwnThing *t = (MyOwnThing *) new Thing();

投射的需要应该是一个危险信号:Thing a MyOwnThing。它甚至 std::vector<int> init()无法行动。

正式地,您在MyOwnThing上从非MyOwnThing的对象调用该函数后立即触发了UB。行为随虚拟析构函数而变化的荒谬事实是一切都崩溃的症状,因为你将某个任意内存部分视为std::vector<int>