簡體   English   中英

刪除多個(虛擬)繼承中涉及的對象時,為什么會出現無效的塊崩潰?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM