共用方式為


警告 C26407

偏好限定範圍的物件,不要不必要地配置堆積 (r.5)

為了避免不必要的指標使用,我們會嘗試偵測本機配置的常見模式。 例如,我們偵測呼叫運算子 new 的結果儲存在區域變數中,之後會明確刪除。 這項檢查支援 C++ Core 指導方針規則 R.5 偏好限定範圍的物件,不要不必要地 配置堆積。 若要修正此問題,請使用 RAII 類型,而不是原始指標,並允許它處理資源。 顯然,不需要建立包裝函式類型來配置單一物件。 相反地,物件的型別區域變數會運作得更好。

備註

  • 為了減少警告數目,程式碼分析只會偵測擁有者指標的這個模式。 因此,必須先正確標記擁有者。 如果我們收到來自客戶支援這類案例的 Visual Studio C++ 開發人員社群 意見反應, 我們可以輕鬆地擴充此分析,以涵蓋原始指標。

  • 範圍 物件 字詞可能會有點誤導。 一般而言,我們建議您使用本機變數,其存留期會自動管理,或有效率地管理動態資源的智慧物件。 智慧物件可以執行堆積配置,但它在程式碼中並不明確。

  • 如果陣列配置引發警告,而動態緩衝區通常需要此警告,您可以使用標準容器或 std::unique_pointer<T[]> 來修正它。

  • 模式只會偵測到區域變數。 在指派配置給全域變數,然後在相同函式中刪除的情況下,我們不會發出警告。

程式碼分析名稱: DONT_HEAP_ALLOCATE_UNNECESSARILY

範例 1:堆積上不必要的物件配置

auto tracer = new Tracer();
ScanObjects(tracer);
delete tracer;  // C26407

範例 2:堆積上不必要的物件配置(以本機物件固定)

Tracer tracer;  // OK
ScanObjects(&tracer);

範例 3:堆積上不必要的緩衝區配置

auto value = new char[maxValueSize];
if (ReadSetting(name, value, maxValueSize))
    CheckValue(value);
delete[] value; // C26407

範例 4:堆積上的不必要的緩衝區配置(使用容器固定)

auto value = std::vector<char>(maxValueSize); // OK
if (ReadSetting(name, value.data(), maxValueSize))
    CheckValue(value.data());