我正在通過聯繫對象(儘管對象類型不應該影響任何內容)的矢量進行搜索,並在找到該對象時返回指向該對象的指針,否則返回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。
非常感謝!你能解釋爲什麼這段代碼不會段錯誤,但我的原始文件是嗎? – user3288091
像所有其他評論過的人一樣。因爲您正在返回聯繫人的本地副本。語句Contact c = * iter;調用Contact的拷貝構造函數在堆棧上構建一個新的Contact對象。然後你返回本地聯繫人的地址,這個地址在函數返回後是無效的,因爲它被破壞了。這個答案返回迭代器實際指向的內容(即列表中的實際對象)。函數返回後,該對象不會被破壞。所以它仍然有效。 – anonymous