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)我懷疑這個演員陣容可能是問題的根源。
演員陣容看起來相當可疑IMO。爲了清晰(至少),我會使用'dynamic_cast'或'static_cast'。演員陣容也可能會進行重新演繹。 – UnholySheep
由於C++使用OO多態性,您對此有嚴重的誤解。 [選擇一本好書](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list),並回到基礎。 – StoryTeller
刪除代碼中的轉換,並在沒有轉換的情況下進行修復。作爲一般規則,每當您發現自己需要演員陣容時,因爲其他方面存在編譯器錯誤,您在投射前需要考慮10次。機會是,你做錯了什麼。 – SergeyA