【问题标题】:Segfault on returning pointer返回指针时的段错误
【发布时间】:2014-03-26 02:23:03
【问题描述】:

我正在搜索 Contact 对象的向量(尽管对象的类型不应该影响任何东西),如果找到,则返回指向该对象的指针,否则返回 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 并返回 void 指针而不是 null 指针(如果结果不是 NULL/nullptr,则将 static_cast 返回到 Contact*)。

我不确定它为什么会出现段错误。我知道 NULL 在 C++ 中被定义为 0,但是使用 nullptr(应该只是 void* 类型的指针,对吗?)并没有停止段错误。

【问题讨论】:

    标签: c++ pointers segmentation-fault


    【解决方案1】:

    由于您要返回一个指向联系人的指针,因此返回迭代器指向的任何内容

    return &(*iter);
    

    而不是

    return &c;
    

    【讨论】:

    • 非常感谢!你能解释一下为什么那个代码没有段错误,但我的原始代码有吗?
    • 像所有其他评论过的人一样。因为您要返回联系人的本地副本。语句Contact c = *iter; 调用Contact 的复制构造函数在堆栈上构建一个新的Contact 对象。然后您返回本地联系人的地址,该地址在函数返回后无效,因为它已被破坏。这个答案返回迭代器实际指向的任何内容(即列表中的实际对象)。该对象在函数返回后不会被破坏。所以它仍然有效。
    【解决方案2】:

    您返回一个局部变量的地址 (c)。

    【讨论】:

    • 这是一种不好的做法吗?如果是这样,返回指针的最佳做法是什么?
    • 局部变量存在栈上,从函数返回后不再存在,所以返回的指针无效。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 2020-02-09
      • 2018-07-29
      • 2015-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多