2016-12-29 89 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>

相關問題