- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
请检查下面的两个代码片段。虽然在示例 2 中,由于传递局部变量的 ref 显然存在悬空引用问题,但您认为示例 1 中是否存在相同的问题?我自己认为示例 1 是正确的。当数据被插入数据结构 (STL::queue
) 时,ref 被获取(enqueue
的函数头是 void 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;
}
最佳答案
示例 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
}
关于c++ - 从函数返回对数据的引用会导致悬空引用问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6433727/
我遵循了 V. Romeo 关于实体管理的教程(在 GitHub 和 Youtube 上)。 然后我尝试重写类 CEntity、CComponent 和测试 CPosition(主要来自 Romeo
为什么下面的代码中有悬空引用?我认为对 const 的引用总是将临时对象的生命周期延长到它们的范围。 boost::filesystem::recursive_directory_iterator i
我有一个多线程应用程序,将传入消息发布到 rabbitmq 交换。使用 rabbitmq java 客户端,我在应用程序启动时创建了一个 rabbitmq 连接,并在我的所有线程中共享它。每个线程都会
我有一个 Git 存储库,其中有大量提交不在特定分支下,我可以 git show 它们,但是当我尝试列出包含它们的分支时,它没有返回任何内容。 我认为这是悬空提交/树问题(由于 -D 分支),所以我修
我是 Linux 的新手,并且继承了保持我们的单一 Linux 服务器运行的职责。这是我们的SVN服务器,所以比较重要。 原来在我之前维护它的人有一个 cron 任务,当有太多 svnserve 进程
我是一名优秀的程序员,十分优秀!