2014-03-26 342 views
1

我正在通過聯繫對象(儘管對象類型不應該影響任何內容)的矢量進行搜索,並在找到該對象時返回指向該對象的指針,否則返回null。以下是代碼:返回指針時發生段錯誤

Contact* searchByLastName(string lname) { 

for (auto iter = LIST.begin(); iter != LIST.end(); ++iter) { 
    Contact c = *iter; //Dereference 
    if (lname.compare(c.getLastName()) == 0) { 
     return &c; 
    } 
} 
return NULL; 
} 

如果該方法返回NULL(即在LIST中未找到聯繫人),則代碼正常工作。如果聯繫人在列表中,程序段錯誤。我試過使用nullptr而不是NULL,並返回一個空指針而不是空指針(如果結果不是NULL/nullptr,則執行static_cast回聯繫人*)。

我不知道爲什麼它的segfaulting。我知道NULL在C++中被定義爲0,但是使用nullptr(它應該只是void *類型的指針,對嗎?)並沒有停止segfaulting。

回答

3

因爲你是返回一個指針聯繫,返回不管它是什麼指向迭代器

return &(*iter); 

,而不是

return &c; 
+0

非常感謝!你能解釋爲什麼這段代碼不會段錯誤,但我的原始文件是嗎? – user3288091

+1

像所有其他評論過的人一樣。因爲您正在返回聯繫人的本地副本。語句Contact c = * iter;調用Contact的拷貝構造函數在堆棧上構建一個新的Contact對象。然後你返回本地聯繫人的地址,這個地址在函數返回後是無效的,因爲它被破壞了。這個答案返回迭代器實際指向的內容(即列表中的實際對象)。函數返回後,該對象不會被破壞。所以它仍然有效。 – anonymous

2

您返回本地變量的地址(c)。

+0

這是一個不好的做法?如果是這樣,返回指針的最佳做法是什麼? – user3288091

+0

堆棧中存在局部變量,從函數返回後該局部變量不再存在,因此返回的指針將無效。 – kol

1

你是返回一個局部變量的地址,這將一旦函數searchByLastName退出,就會被銷燬。你應該返回一個指向迭代器指向的指針。