警告 C26403
owner<T>
ポインター 'variable' をリセットまたは明示的に削除する (r.3)
所有者ポインターは一意のポインターに似ています。リソースを排他的に所有し、リソースのリリースを管理するか、他の所有者に転送します。 このチェックでは、ローカル所有者ポインターが関数内のすべての実行パスによりリソースを適切に維持していることを検証します。 リソースが別の所有者に転送されなかった場合、または明示的に解放されなかった場合、チェッカーは警告を表示し、ポインター変数の宣言を指します。
詳細については、「C++ Core Guidelines」を参照してください。
解説
現在、このチェックでは、リソースの解放に失敗した正確なパスは提供されません。 この動作は、今後のリリースで改善される可能性があります。 修正の正確な場所を見つけるのは困難な場合があります。 より優れた方法は、複雑な関数の普通のポインターをユニーク ポインターに置き換えてリスクを回避する方法です。
このチェックでは、コード分析をブロックしないために、複雑すぎる関数を破棄することがあります。 一般的に、関数の複雑さはある程度のレベル以下に維持するべきです。 明確な需要がある場合は、C++ コア ガイドライン モジュールにローカルの複雑さのチェックを追加することを検討してください。 この制限は、データ フローに依存する他のルールに適用されます。
この警告は、ポインターの null チェックの後にのみメモリが削除される明らかに誤検知の場合に発生する可能性があります。 これらの誤検知は、ツールの API の現在の制限の結果ですが、今後改善される可能性があります。
コード分析名: RESET_OR_DELETE_OWNER
例
エラー処理中にクリーンアップが見つからない:
gsl::owner<int*> sequence = GetRandomSequence(); // C26403
try
{
StartSimulation(sequence);
}
catch (const std::exception& e)
{
if (KnownException(e))
return; // Skipping the path which deletes the owner.
ReportException(e);
}
delete [] sequence;