C++ 返回指针错误
我正在搜索接触对象的向量(尽管对象的类型不应该影响任何东西),如果找到了对象,则返回指向该对象的指针,否则返回null。代码如下: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()) ==
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对象。然后返回本地联系人的地址,该地址在函数返回后无效,因为它已被破坏。这个答案返回迭代器实际指向的任何对象(即列表中的实际对象)。函数返回后,此对象不会被破坏。所以它仍然有效。