簡體   English   中英

C ++迭代器在向量上迭代時崩潰

[英]c++ Iterator crashing while iterating over vector

我有一個Iformat類,它具有虛函數operator(),每個派生類均實現此功能。

class myClass
{
    std::vector<IFormat*> formatList_;
public:
  void formatAll()
  {
    foreach(IFormat* format , formatList_)
    {
        (*format)();
    }
  }

};

myClass的對象上調用formatAll函數,然后在循環中, operator()函數刪除此myClass對象本身,該對象本身調用了formatAll()函數,由於迭代器損壞,該函數導致崩潰。

約束 :否則無法聲明operator()定義,否則將返回錯誤類型。
另外,不能使用某些指標變量來跳出循環。

有人可以建議一些處理循環的方法,以免僅通過更改循環和迭代器並遵循約束條件而不會崩潰的情況。 謝謝

是的,有時由於回調產生了一系列復雜的操作,這個問題可能會浮出水面。

您有幾種選擇:

  1. 復制formatList_中的formatAll並遍歷副本; 您只是在復制指針,但是如果容器很大,或者如果您在某個地方的緊密循環中運行它,這仍然可能是不可取的;

  2. 在事件驅動的框架中,您可以將(*format)()的執行推遲到下一個應用程序“ tick”的開始,在此循環中僅將其添加到某些工作隊列中; 這實際上是相同的選項#1,只是很多更復雜的,但如果有這樣一個框架,它可以真的很好槽;

  3. 確保以某種方式回調不能直接或間接修改formatList_ 您可以通過禁止“添加”或“刪除”選項或強制推遲使用這些選項來實現。

選項3是“最干凈的”方法,但是同樣,除非您處於事件驅動的框架中,否則實現起來可能很笨拙。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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