C++98 (古いもの) を使用します。
テーブルがあり、ルックアップを考えてみましょう。Ptr はスマート ポインターです。以下のステートメント 1. - .3 は正しいですか、それとも考慮されている両方のケースは、発信者の観点から同じように安全/安全ではありませんか?
検索の関数プロトタイプ:
const Y::Ptr & lookup(const X::Ptr & x);
そして、ルックアップが呼び出される呼び出し元関数:
const Y::Ptr & ret = lookup(x);
ここで、x は X::Ptr オブジェクトまたは X::Ptr の参照です。したがって、上記の 2 行に基づいて、次の使用法があります。
- 関数の引数
const X::Ptr &
。これは通常安全でありX::Ptr
、関数呼び出しが行われたときのコピー コンストラクターを回避します。呼び出し元は、ルックアップ関数呼び出しの間X
、オブジェクトの参照を保持する責任があります。X
- 戻り値
const Y::Ptr &
。これは安全ではありません。この参照がスタック上にある短い期間に、スレッドが中断または中断され、別のスレッドがテーブルからエントリを削除すると、Y オブジェクトとオブジェクトの両方Y::Ptr
が削除されるためです。その結果、Y::Ptr
スタック上の参照は、なくなった Ptr オブジェクトを参照します。 const Y::Ptr &
ルックアップの戻り値を格納するためのローカル参照。#2 と同様の理由で、これは安全ではありませんが、呼び出し元関数でのこのローカル参照のスコープが、戻り値としてのスタック上の参照よりも長いため、おそらくさらに悪いことです。