次の方法で共有


警告 C26400

戻り値を持つ割り当てまたは関数呼び出しの結果を owner<T> 生ポインターに割り当てないでください。代わりに使用 owner<T> します (i.11)

解説

このチェックは、*rule I.11: Never transfer ownership by a raw pointer (T*) を適用するのに役立ちます。これは、ルール R.3 のサブセットである未加工ポインター (T*) が所有していません。 具体的には、結果を生ポインター型に保存する、operator new の呼び出しについて警告します。 また、結果が生ポインターに割り当てられている場合、gsl::owner<T> を返す関数の呼び出しについても警告します。 この考え方は、メモリ リソースの所有権を明確に指定する必要があるということです。 詳細については、「C++ Core Guidelines」を参照してください。

この警告を修正する最も簡単な方法は、リソースが変数宣言においてすぐに割り当てられる場合に auto 宣言を使用することです。 この修正を行うことができない場合、gsl::owner<T> 型を使用することをお勧めします。 new 演算子で初期化された auto 宣言は、"所有者" になります。すべての割り当ての結果は、暗黙的にオーナー ポインターになるはずだからです。 この仮定は auto 変数に適用され、これを owner<T> として扱います。

このチェックによって owner<T> を返す関数の呼び出しにフラグが設定された場合、コード内に本当のバグがあることを示している可能性があります。 基本的には、コードが明らかな所有権 (またはリソースそのもの) の概念を示している箇所が示されます。

現時点では、このルールはローカル変数のみをチェックします。 仮パラメーター、グローバル変数、クラス メンバーなどに割り当てる場合は、フラグは設定されません。 これらのシナリオには、今後対応していく予定です。

コード分析名: NO_RAW_POINTER_ASSIGNMENT

例 1: 単純な割り当て

char *buffer = nullptr;
if (useCache)
    buffer = GetCache();
else
    buffer = new char[bufferSize];  // C26400

例 2: 単純な割り当て (gsl::owner<T> による修正)

gsl::owner<char*> buffer = nullptr;
if (useCache)
    buffer = GetCache();
else
    buffer = new char[bufferSize];  // OK

例 3: 単純な割り当て (auto による修正)

auto buffer = useCache ? GetCache() : new char[bufferSize]; // OK