我有以下课程:
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)我怀疑这个演员可能是问题的根源.
MyOwnThing *t = (MyOwnThing *) new Thing();
Run Code Online (Sandbox Code Playgroud)
铸造的需要应该是红旗:一个Thing是没有一个MyOwnThing.它甚至不具有一个std::vector<int>用于init()采取行动.
形式上,一旦从MyOwnThing非对象上调用该函数,就会触发UB MyOwnThing.行为随虚拟析构函数而变化的荒谬事实是一切都破裂的症状,因为你将一些任意的内存部分视为一个std::vector<int>.
| 归档时间: |
|
| 查看次数: |
50 次 |
| 最近记录: |