警告 C26414
「移動、複製、重新指派或重設本機智能型指標。」
C++ 核心指導方針 :
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());
// ...
}