2013-02-01 104 views
3

我有一個很長的程序,有多個類,所以我不會發布它,除非你需要它。但是在主要回報之後,我得到了分段錯誤。Main返回後的分割錯誤11

使用GDB我可以看到這個錯誤:

program received signal EXC_BAD_ACCESS, Could not access memory. 
Reason: KERN_INVALID_ADDRESS at address: 0x0000002300103be8 
0x00000001000035cc in std::_Rb_tree<std::string, std::string, std::_Identity, std::less,  std::allocator >::_S_right (__x=0x2300103bd0) at stl_tree.h:512 
512  { return static_cast<_Link_type>(__x->_M_right); } 

我很新的C++所以這只是看起來像亂碼給我。任何人都可以破譯它嗎?它看起來像我的一個STL容器可能導致這個問題?有關如何解決它的任何建議?

編輯與代碼:

好了,所以我孤立下來到某處這一點,如果塊main,這是我寫的最後一件事,當我註釋掉程序運行正常。

else if(line.substr(0, 3) == "Rec") // Recieve 
    {  
     istringstream ss(line); 
     string s; // output string 
     string upc; 
     string name; 
     int amount; 
     int count = 0; 
     while(ss >> s) // go through the words in the line 
     { 
      count++; 
      if(count == 2) 
      upc = s; 
      else if (count == 3) 
      { 
      istringstream isa(line.substr(20, 2)); 
      isa >> amount; //Parse the amount 
      } 
      else if (count == 4) 
      name = s; 
     } 


     warehouses.find(name)->second.receive_food(upc, amount); //add the food to the warehouse 

    } 

爲了澄清,我們正在尋找在line的格式如下:

Receive: 0984523912 7 Tacoma 

warehouses是地圖:map<string, a4::warehouse> warehouses; //all the warehouses.

這裏是倉庫接收方法

void warehouse::receive_food(std::string upc, int amount) 
{ 
    items.find(upc)->second.receive(amount); 

    todays_transactions = todays_transactions + amount; 
} 

哪裏itemsstd::map<std::string, food> items;

,最後是食品Receive方法

void food::receive(int amount) 
{ 
    crates.push_back(crate(life, amount)); 
} 

哪裏cratesstd::list<crate> crates;

而一個crate

class crate 
{ 
    public: 
     crate(int, int); 
     ~crate(); 
     int life; 
     int quantity; 
}; 
+6

需要查看代碼。 –

+3

第一次猜測:您使用原始指針很多,它在某處出錯,現在在STL段錯誤中有一些功能因此而出現問題。祝你好運,這些東西*很難*調試。如果可行,用調試符號編譯你的程序並用'valgrind'測試它。 – us2012

+1

發佈代碼之前,請將其縮小。將其縮小到顯示錯誤的最小程序。然後在你的問題中發佈*該程序。請參閱http:// SSCCE。有關該調試技術的更多信息,請參閱ORG。 –

回答

1

看起來像一個內存損壞。 _Rb_tree表明該錯誤與std::map有關,通常以red-black tree的形式實現。沒有看到代碼就很難說更多。我建議使用Valgrind來調試問題。

看過您在更新中發佈的代碼後,我認爲問題在於您不檢查warehouses.find(name)是否返回有效的迭代器。如果找不到密鑰,它可以返回map::end()

添加一個檢查:

map<string, a4::warehouse>::iterator it = warehouses.find(name); 
    if (it != warehouses.end()) 
    it->second.receive_food(upc, amount); 
    else ; // handle the case of a missing key 

和類似檢查其他呼叫map::find

+0

哪張地圖?或者他們兩個?我如何去檢查它?謝謝 – Deekor

+0

@Deekor:我不知道你的代碼來說明哪張地圖。通常你應該檢查'find'是否每次都返回'end',除非你確定密鑰在那裏。 – vitaut

+0

原來我們的倉庫名稱被插入到地圖中,導致我們的查找失敗。 – Deekor