2

请检查下面的两个代码片段。虽然在示例 2 中,显然存在悬空引用问题,因为传递了局部变量的 ref,您认为示例 1 中是否存在相同的问题?我自己认为样本 1 是正确的。当数据被推送到数据结构( )中时,引用被获取( isstl::queue的函数头)。所以通过这里返回数据应该没有问题。或者有吗?enqueuevoid enqueue(const int &data)&data

样品 1:

int const& dequeue()
{
    _mutex.lock();
    int &data = _queue.back();
    _queue.pop();
    _mutex.unlock();
    return data;
}

样本 2:

int const& dequeue()
{
    _mutex.lock();
    int data = _queue.back();
    _queue.pop();
    _mutex.unlock();
    return data;
}
4

1 回答 1

1

样本 1 不正确。

一旦您致电,您的参考资料将失效pop()

函数将返回的引用必须是函数终止时仍然有效的对象。

这也意味着样本 2 不正确,但不是出于您认为的原因。是的,返回该引用是无效的(它甚至不应该编译),但data在函数结束之前是无效的 - 同样,在pop()调用之后,您对该容器中对象的任何引用都变得无效。

你有什么理由通过引用返回吗?您显然根本不希望值发生变化,而您的参考是const,那么为什么不按值返回呢?

int dequeue()
{
    _mutex.lock();
    int data = _queue.back();
    _queue.pop();
    _mutex.unlock();

    return data;
}

在回答您更一般的问题时,关于返回本地声明的引用,这很好,只要它所引用的对象在函数终止后仍然有效。例如:

int glob;

int& f(){
  int x;
  int& ref = glob;
  return x;
}

int main(){
  foo()=10;  //this is fine
}
于 2011-06-22T01:22:17.373 回答