C6278
更新:2007 年 11 月
警告 C6278: <variable> 是以陣列 new [] 配置,但以純量 delete 刪除。將不會呼叫解構函式
這項警告只會出現在 C++ 程式碼中,表示呼叫函式是以陣列 new [] 運算子配置記憶體,但是以純量 delete 運算子釋放記憶體。這對 C++ 標準和 Microsoft VC++ 實作 (Implementation) 而言是未定義的行為。至少有下列三項原因可能會導致問題的產生:
會叫用 (Invoke) 陣列中個別物件的建構函式 (Constructor),但不會叫用解構函式 (Destructor)。
如果全域 (或類別特定) 的 operator new 和 operator delete 與 operator new[] 和 operator delete[] 不相容,可能會產生未預期的結果。
依靠未定義的行為絕對是非常危險的。
這項缺失的實際狀況難以預測。有可能會造成具有解構函式的類別在執行記憶體取消配置時有所遺漏、造成具有解構函式的類別在執行語意之重要作業時發生不一致的行為,或是當運算子遭到覆寫後造成記憶體毀損或無法運作。在其他情況中,不相符的行為或許會因為編譯器 (Compiler) 及其程式庫的實作而顯得不重要。但是分析工具有時無法區分這些狀況。
如果記憶體是以陣列 new [] 配置,則它一般會以陣列 delete[] 釋放。
範例
下列範例程式碼會產生這則警告:
class A
{
// members
};
void f( )
{
A *pA = new A[5];
// code ...
delete pA;
}
若要更正這則警告,請使用下列範例程式碼:
void f( )
{
A *pA = new A[5];
// code ...
delete[] pA;
}
如果陣列中的基礎物件是基本型別 (Primitive Type) (例如 int、float、enum) 或指標,則不會呼叫任何解構函式。在這類情況下,會轉而產生警告 C6283。