我正在通过联系对象(尽管对象类型不应该影响任何内容)的矢量进行搜索,并在找到该对象时返回指向该对象的指针,否则返回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