共用方式為


警告 C26414

「移動、複製、重新指派或重設本機智能型指標。」

C++ 核心指導方針
R.5:偏好限定範圍的物件,不要不必要地進行堆積配置

智慧型指標方便動態資源管理,但並非總是必要。 例如,使用標準容器管理本機動態緩衝區可能比較簡單且更有效率。 例如,如果單一物件絕對不會超過其建立者函式,您可能完全不需要動態配置。 這些變數可以取代為區域變數。 當案例需要變更擁有權時,智慧型指標會變得方便。 例如,當您多次重新指派動態資源,或在多個路徑中時。 它們也適用于從外部程式碼取得的資源。 而且,當智慧型指標用來延長資源的存留期時。

備註

這項檢查可辨識標準 std::unique_pointerstd::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());
    // ...
}