2011-11-29 85 views
-1

我有一個函數返回一個迭代器,我保存迭代器。 這是返回的迭代器功能(其中building是一個枚舉):功能返回Qt分段錯誤

vector<building>::iterator it; 

for (it = building.begin(); it != building.end(); ++it) 
{ 
    if(it->getType() == type) 
     return it; 
} 

return gebouwen.end(); 

現在,當我做it->isBusy(); Qt的崩潰,並給出一個分段錯誤。

isBusy功能是:

bool isBusy(void) const { return busy ; }; 

當我調試在Qt的調試器停止在該行的代碼,並給出:

 
The inferior stopped because it received a signal from the operating system. 
Signal name: SIGSEGV 
Signal meaning: Segmentation fault 

我不明白爲什麼這個簡單的功能讓系統停止。我重新啓動,因爲有人說這是因爲你有內存泄漏。但是這仍然無法解決它。

+1

除了其他問題,請考慮在這樣的for循環後返回「it」,並用「break」替換內部的「return it」,這樣就有一個返回點。 –

+2

@ChristianRau'namespace nl {typedef en :: buildings gebouwen; }':p – StackedCrooked

+0

如果'building'是一個枚舉,那麼你如何在其上調用'.begin()'?請澄清這個問題。向量聲明在哪裏?而不是編寫一些類似的代碼,你應該粘貼你使用的實際代碼(或確保你的兼容示例編譯) –

回答

2

您正在返回本地向量的迭代器。迭代器被複制,但該向量在返回後被銷燬。所以它崩潰了。

相反,您可能想要返回迭代器當前指向的項目:*it

+0

你怎麼知道載體是本地的? – fschoenm

+0

你是對的問,這只是一個假設。但是,問題中沒有足夠的信息來決定。 –

3

這很有可能是因爲調用isBusy()方法對由gebouwen.end()返回的「結束」迭代器引用的對象造成的。沒有與該特殊迭代器關聯的對象,因此觸發了未定義的行爲。您必須將該函數返回的迭代器與gebouwen.end()進行比較,以確保找到您的對象。

另外,有void C++作爲C++中的參數列表沒有任何意義。在C中,void foo()void foo (void)之間有區別 - 第一個暗示foo可以接受任何參數,而第二個意味着它不能接受任何參數。但這並不意味着C++中的任何內容,因此無法正確輸入4個以上的字符。

0

你的代碼真的:

vector<building>::iterator foo( vector<building> & gebouwen, Type type) 
{ 
    vector<building>::iterator it; 

    for (it = gebouwen.begin(); it != gebouwen.end(); ++it) { 
     if(it->getType() == type) 
     return it; 
    } 
    return it; 
} 

然後要麼答案弗拉德或塔馬斯適用。你可能會調用gebouwen.end() - > isBusy(),這會導致SIGSEGV。或者在gebouwen超出範圍之後調用它。