[英]Why do I get an invalid block crash when deleting objects involved in multiple (virtual) inheritance?
我正在編輯這個問題,使其更具可讀性和更少人為。 我已經設法用以下簡短的代碼復制我的問題。 那么問題是:為什么在~A()中的“刪除p”行上,_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)的斷言失敗會導致失敗?
class A;
class I
{
public:
I(const A *p) : parent_(p) {}
virtual void foo() = 0;
protected:
const A *parent_;
};
class I1 : public virtual I
{
public:
I1(const A *p) : I(p) {}
virtual void foo() {}
};
class A
{
public:
A() {}
virtual ~A()
{
for (size_t i = 0; i < it_.size(); ++i)
{
I *p = it_.at(i);
delete p;
}
}
virtual I* add() { I *p = new I1(this); it_.push_back(p); return p; }
protected:
vector<I*> it_;
};
int _tmain(int argc, _TCHAR* argv[])
{
A *a = new A();
for (int i = 0; i < 10; ++i) a->add();
delete a;
system("pause");
return 0;
}
尚未閱讀整個問題,但首先應將Sequence
類中的Destructor標記為virtual
。
virtual ~Sequence();
如果多態Base類的析構函數不是virtual
則在通過Base類指針刪除派生類對象時,您將看到未定義行為。
SeqItem
的析構函數是虛擬的嗎? 如果沒有,你有未定義的行為; 實際上,如果涉及多重繼承,這種未定義的行為將僅顯示即時的災難性結果,即使這樣,也不一定,除非繼承是虛擬的。 (如果沒有多重繼承,它通常會起作用,盡管它經常會泄漏內存。)
你需要虛擬地從基類派生 - 也就是說
class SeqItemB : virtual public SeqItemA { .. }
class SeqItemC : virtual public SeqItemA { .. }
然后
class SeqItemD : public SeqItemB, public SeqItemC { .. }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.