2014-03-26 521 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退出,就会被销毁。你应该返回一个指向迭代器指向的指针。