我们使用C++ 98(较旧的一个)。返回对智能指针的const引用vs使用引用作为参数
比方说,我们有一张桌子,并考虑查找。 Ptr是一些智能指针。 下面的语句1. - .3正确或两种情况都考虑从呼叫者的角度来看是同样安全/不安全 ?查找的
函数原型:
const Y::Ptr & lookup(const X::Ptr & x);
和呼叫者函数,其中查找叫做:
const Y::Ptr & ret = lookup(x);
其中,x是X :: PTR对象或X :: PTR的参考。所以,我们有以下两行的用法。
- 函数参数
const X::Ptr &
。这通常是安全的,并避免函数调用时复制构造函数X::Ptr
。调用者负责为对象X
保留X
的引用,以在查找函数调用的持续时间内持续。 - 返回值
const Y::Ptr &
。这是不安全的,因为在此引用位于堆栈中的短暂持续时间内,如果线程被中断/挂起并且另一个线程从表中删除条目,则Y对象和Y::Ptr
对象都将被删除。结果,堆栈上的Y::Ptr
引用引用了一个不存在的Ptr对象。 - 本地参考
const Y::Ptr &
来存储查找的返回值。这是不安全的,因为#2类似的原因,但可能更糟,因为调用方函数中的本地引用的作用域比堆栈上的ref长作为返回值。
这个问题不仅仅是参考vs值,而是在初始文章中描述的两个问题中哪一个更为安全。 – user2890398