Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回指针错误_C++_Pointers_Segmentation Fault - Fatal编程技术网

C++ 返回指针错误

C++ 返回指针错误,c++,pointers,segmentation-fault,C++,Pointers,Segmentation Fault,我正在搜索接触对象的向量(尽管对象的类型不应该影响任何东西),如果找到了对象,则返回指向该对象的指针,否则返回null。代码如下: Contact* searchByLastName(string lname) { for (auto iter = LIST.begin(); iter != LIST.end(); ++iter) { Contact c = *iter; //Dereference if (lname.compare(c.getLastName()) ==

我正在搜索接触对象的向量(尽管对象的类型不应该影响任何东西),如果找到了对象,则返回指向该对象的指针,否则返回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(即在列表中找不到联系人),则代码可以正常工作。如果该触点在列表中,则程序会出现故障

我尝试过使用nullptr而不是NULL,并返回一个void指针而不是NULL指针(如果结果不是NULL/nullptr,则对Contact*执行静态_转换)


我不知道为什么会有断层。我知道在C++中NULL被定义为0,但是使用NulLPTR(它应该只是一个类型Vault*的指针,右边的)没有停止SeaFultType。

< P>您返回一个局部变量的地址(<代码> C>代码>)。返回迭代器指向的任何内容

return &(*iter);
而不是

return &c;

因为您要返回一个指向Contact的指针,所以返回迭代器指向的任何内容

return &(*iter);
而不是

return &c;

您正在返回一个局部变量的地址,一旦函数searchByLastName退出,它将被销毁。您应该返回一个指向迭代器指向的对象的指针。

您返回的是一个局部变量的地址,一旦函数searchByLastName退出,它将被销毁。您应该返回一个指向迭代器指向的对象的指针。

这是一种不好的做法吗?如果是这样的话,返回指针的最佳实践是什么?堆栈上存在局部变量,从函数返回后该变量不再存在,因此返回的指针将无效。这是一种不好的实践吗?如果是这样,返回指针的最佳实践是什么?堆栈上存在局部变量,从函数返回后该变量将不再存在,因此返回的指针将无效。非常感谢!你能解释一下为什么那个代码没有错误,但我的原创代码有错误吗?就像所有其他评论过的人一样。因为您正在返回联系人的本地副本。声明
Contact c=*iter
调用Contact的复制构造函数在堆栈上构建新的Contact对象。然后返回本地联系人的地址,该地址在函数返回后无效,因为它已被破坏。这个答案返回迭代器实际指向的任何对象(即列表中的实际对象)。函数返回后,此对象不会被破坏。所以它仍然有效。非常感谢你!你能解释一下为什么那个代码没有错误,但我的原创代码有错误吗?就像所有其他评论过的人一样。因为您正在返回联系人的本地副本。声明
Contact c=*iter
调用Contact的复制构造函数在堆栈上构建新的Contact对象。然后返回本地联系人的地址,该地址在函数返回后无效,因为它已被破坏。这个答案返回迭代器实际指向的任何对象(即列表中的实际对象)。函数返回后,此对象不会被破坏。所以它仍然有效。