警告 C26414
"ローカル スマート ポインターの移動、コピー、再割り当て、またはリセット。"
C++ Core Guidelines:
R.5: スコープ オブジェクトを優先的に使用し、不必要なヒープ割り当ては行わないでください
スマート ポインターは動的リソース管理に便利ですが、必ずしも必要とは限りません。 たとえば、標準のコンテナーを使用してローカルの動的バッファーを管理する方が簡単で効率的な場合があります。 単一オブジェクトに対する動的割り当ては、たとえば作成関数より長く存続しないのであれば、まったく不要であることがあります。 これらはローカル変数に置き換え可能です。 スマート ポインターは、所有権の変更が必要なシナリオの場合に便利です。 たとえば、動的リソースを複数回再割り当てする場合や、複数のパスで再割り当てする場合などです。 また、外部コードから取得したリソースにも役立ちます。 さらに、スマート ポインターは、リソースの有効期間を延長する場合に使用されます。
解説
このチェックでは、標準の std::unique_pointer
および std::shared_pointer
テンプレートと、スマート ポインターを意図している可能性があるユーザー定義型の両方が認識されます。 そのような型には、次の操作を定義しているものが想定されます。
パブリックであり、削除済みとしてマークされていないオーバーロードされた逆参照演算子またはメンバー アクセス演算子。
削除されても既定化されてもいないパブリック デストラクター。 これには、空として明示的に定義されたデストラクターが含まれます。
型 Microsoft::WRL::ComPtr
は共有ポインターとして動作しますが、COM の有効期間管理の影響を受ける特定のシナリオでよく使用されます。 過度なノイズを回避するために、この型は除去されます。
このチェックでは、スマート ポインターに割り当てられた明示的なローカル割り当てを探し、スコープ付き変数を代替として使用できるかどうかを特定します。 演算子 new
の直接呼び出しと、std::make_unique
や std::make_shared
などの特殊な関数が、どちらも直接割り当てとして解釈されます。
コード分析名: RESET_LOCAL_SMART_PTR
例
動的バッファー:
void unpack_and_send(const frame &f)
{
auto buffer = std::make_unique<char[]>(f.size()); // C26414
f.unpack(buffer.get());
// ...
}
コンテナーに置き換えられた動的バッファー:
void unpack_and_send(const frame &f)
{
auto buffer = std::vector<char>(f.size());
f.unpack(buffer.data());
// ...
}