共用方式為


警告 C26400

請勿將配置的結果或具有 owner<T> 傳回值的函式呼叫指派給原始指標,請改用 owner<T> (i.11)

備註

這項檢查有助於強制執行 *rule I.11:永遠不要透過原始指標 (T*) 轉移擁有權,這是規則 R.3 的子集:原始指標(T*) 不是擁有 。 具體來說,它會在任何 對 的呼叫 operator new 上發出警告,這會將其結果儲存在原始指標類型的變數中。 它也會在呼叫函式時發出警告,如果函式的結果指派給原始指標,則會傳回 gsl::owner<T> 。 其概念是,您應該清楚說明記憶體資源的擁有權。 如需詳細資訊,請參閱 C++ 核心指導方針

修正此警告最簡單的方式,是在變數宣告上立即指派資源時使用 auto 宣告。 如果無法進行此修正,建議您使用 類型 gsl::owner<T>auto使用 運算子 new 初始化的宣告是「擁有者」,因為我們假設任何配置的結果都是隱含擁有者指標。 我們會將此假設傳送至 變數, auto 並將它 owner<T> 視為 。

如果此檢查會標幟對傳回 owner<T> 之函式的呼叫,則可能表示程式碼中有合法的 Bug。 基本上,它會指向程式碼洩漏明確擁有權概念的位置(或許是資源本身)。

此規則目前只會檢查區域變數。 如果您將配置指派給正式參數、全域變數、類別成員等等,則不會加上旗標。 針對未來的工作,已規劃適當涵蓋這類案例。

程式碼分析名稱: NO_RAW_POINTER_ASSIGNMENT

範例 1:簡單配置

char *buffer = nullptr;
if (useCache)
    buffer = GetCache();
else
    buffer = new char[bufferSize];  // C26400

範例 2:簡單配置(已修正 gsl::owner<T>

gsl::owner<char*> buffer = nullptr;
if (useCache)
    buffer = GetCache();
else
    buffer = new char[bufferSize];  // OK

範例 3:簡單配置(固定為 auto

auto buffer = useCache ? GetCache() : new char[bufferSize]; // OK