我有以下课程:
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)我怀疑这个演员可能是问题的根源。
答案 0 :(得分:9)
MyOwnThing *t = (MyOwnThing *) new Thing();
投射的需要应该是一个危险信号:Thing
不 a MyOwnThing
。它甚至 std::vector<int>
init()
无法行动。
正式地,您在MyOwnThing
上从非MyOwnThing
的对象调用该函数后立即触发了UB。行为随虚拟析构函数而变化的荒谬事实是一切都崩溃的症状,因为你将某个任意内存部分视为std::vector<int>
。