我們使用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