2012-12-29 23 views
0

我有一個deque<rect*> rects其中rect是用戶定義的類。當我嘗試將insert a rect*加入其中時,出現分段錯誤。 gdb將問題追溯到我呼叫rects.insert(it,new rect([constructor parameters]));的函數__memmove_sse3(),其中itdeque<rect*>::iterator。什麼可能導致這個錯誤?用戶自定義指針的分界錯誤

編輯: 這裏是我的代碼片段:

for(deque<rect*>::iterator it=rects.begin();it!=rects.end();++it) 
     { 
      rect r=*r1; 
      rect r2=*(*it); 
      if(!r2.there) 
       continue; 
      if(r.down>r2.up || r.up<r2.down || r.right<r2.left || r.left>r2.right) 
       continue; 
      if(r.left>r2.left) 
       rects.insert(it,new rect(r2.left,r2.down,r.left,r2.up,r2.color)); 
      if(r.right<r2.right) 
       rects.insert(it,new rect(r.right,r2.down,r2.right,r2.up,r2.color)); 
      if(r.up<r2.up) 
       rects.insert(it,new rect(max(r.left,r2.left),r.up,min(r.right,r2.right),r2.up,r2.color)); 
      if(r.down>r2.down) 
       rects.insert(it,new rect(max(r.left,r2.left),r2.down,min(r.right,r2.right),r.down,r2.color)); 
      r2.there=false; 
     } 
+1

迭代器失效了嗎? – Pubby

+1

向我們顯示實際的代碼。 – Nawaz

回答

2

的問題是,你要插入項目std::deque其無效,你要在for循環遞增的迭代器:

標準(草案n3485)說,在§23.3.3.4/ 1(強調礦),

效果:在雙端隊列的中間的插入所有迭代和引用無效到雙端隊列的元素。 在deque 兩端的插入使所有迭代器無效,但對deque元素的引用的有效性無效。

1

段錯誤可能來自任意數量的來源,並立即做並不總是明顯。你有可能會溢出一個數組,使用stl容器以無效的方式,或者類似的東西 - 當你破壞你不擁有的可用於例如分配會計,它可以使未來的分配,釋放,移動,或任何其他間接訪問失敗壯觀。

拿出大槍可能有助於快速解決這個問題!如果您使用的是運行valgrind的系統,則可以使用valgrind的memcheck模塊,也可以在Windows上使用類似Application Verifier的東西。

您的編譯器或庫可能具有標準的庫/ STL調試功能 - 如果您在IDE中,請查看您的可用選項。對於libstdC++(通常與gcc/g ++一起使用),您可以查看libstdc++ Debugging Support options

這裏是我的earlier answer to a question about heap corruption其中討論了這些工具,並且我list of reasons you might want to overload operator new and delete也有工具的其他名單。基於您的代碼


我說你的無效循環迭代(無恥的自我推銷,在這裏,但我認爲這是相當不錯的名單!)。 From http://www.sgi.com/tech/stl/Deque.html

deque的迭代器失效的語義如下。插入 (包括push_front和push_back)會使 引用雙端隊列的所有迭代器失效。在deque的中間擦除將導致引用該deque的所有 迭代器無效。在 雙端隊列(包括pop_front和pop_back)的開始或末尾擦除時,如果迭代器指向已擦除的單元,則它將僅使 無效。