2016-12-29 87 views
0

我有以下类别:为什么std :: vector :: push_back具有虚拟析构函数的segfaults?

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一个不错的段错误。如果我从Thing中删除虚拟析构函数,那么所有东西都可以顺利运行。怎么了?

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

+2

演员阵容看起来相当可疑IMO。为了清晰(至少),我会使用'dynamic_cast'或'static_cast'。演员阵容也可能会进行重新演绎。 – UnholySheep

+3

由于C++使用OO多态性,您对此有严重的误解。 [选择一本好书](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list),并回到基础。 – StoryTeller

+1

删除代码中的转换,并在没有转换的情况下进行修复。作为一般规则,每当您发现自己需要演员阵容时,因为其他方面存在编译器错误,您在投射前需要考虑10次。机会是,你做错了什么。 – SergeyA

回答

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

需要投应该是红旗:一个Thing一个MyOwnThing。它甚至没有std::vector<int>init()采取行动。

形式上,只要您在MyOwnThing以外的对象上调用该函数,就会触发UB,该对象不是MyOwnThing。行为随虚拟析构函数而变化的无意义事实是一切事情的分裂症状,因为您将某些任意内存段视为std::vector<int>

相关问题