2010-07-09 43 views
3

我有這段代碼:引用向量::前的作品,但矢量::開始不

cerr << client->inventory.getMisc().front()->getName() << endl; 
vector<itemPtr>::iterator it; 
it = client->inventory.getMisc().begin(); 
cerr << (*it)->getName() << endl; 

讓我解釋一下:

clienttr1::shared_ptr那點到具有名爲inventory的成員的對象,該成員具有可由getMisc()訪問的私人vector<itemPtr>成員。 itemPtrtr1::shared_ptr<Item>的typedef,getName()返回Item的私人std::string成員。

本質上,client->inventory.getMisc()歸結爲std::vector,我試圖獲得一個迭代器到它的第一個元素。

問題是第四行段錯誤。顯然,它指向的迭代器或shared_ptr無效。我用第一個cerr語句來測試vector本身是否有效,並且它應該打印,所以我認爲它是。

有什麼我做錯了嗎?或者,你們會做什麼來調試呢?

+2

Rahter比「解釋一下」能否提供代碼。這個網站上的人員非常善於理解代碼並弄清楚它的含義。它比英文描述更精確。 – 2010-07-09 17:56:49

回答

12

getMisc的簽名究竟是什麼?

如果你實際上返回了std::vector<itemPtr>那麼你將返回一個拷貝的列表。在這種情況下,第一個訪問模式將工作(緩慢),因爲在front完成執行之前,臨時副本不會被銷燬,屆時itemPtr本身將被複制到臨時副本中。第二個失敗的原因是因爲在獲得迭代器begin後,臨時值超出範圍並被銷燬,從而使剛創建的迭代器掛起。

+0

我猜這是精神調試的一個很好的一點。 – 2010-07-09 17:41:49

+0

@Walter:很好。 – 2010-07-09 17:44:24

+0

是的,這就是它的回報。我應該怎麼做,返回一個參考? – Max 2010-07-09 17:48:06

1

你們會做什麼來調試呢?

雖然要查看front()返回的內容和(*it)返回的有什麼不同,

+0

我試過這個,但是我不能用gdb很好地檢查變量。當我嘗試'p client-> inventory.getMisc()。front()'時,gdb說'沒有名爲inventory的成員或方法'。當我嘗試'p * it'時,我發現它擁有'shared_ptr '。當我嘗試'p ** it'時,gdb會說'你試圖傳遞給operator *的一個參數不能轉換爲函數想要的'。 – Max 2010-07-09 17:44:58

0

你確定載體不是空的嗎?有可能frontbegin的行爲稍有不同,front可能會有純粹的機會,但迭代器中的其他檢查本身​​在使用時會導致seg錯誤。