C6278
Ostrzeżenie C6278: <variable> jest przydzielana za pomocą tablicowego operatora new [], ale usuwana za pomocą usuwania skalarnego.Nie zostaną wywołane destruktory
Ostrzeżenie to pojawia się tylko w przypadku kodu C++ i wskazuje, że wywołująca funkcja niespójnie przydzieliła pamięć tablicowym operatorem new [], ale zwolniła go skalarnym operatorem delete.Zgodnie ze standardami C++ i implementacją Microsoft Visual C++, jest to niezdefiniowane zachowanie C++.Istnieją co najmniej trzy powody, dla których może to spowodować problemy:
Konstruktory dla poszczególnych obiektów w tablicy są wywoływane, ale nie destruktory.
Globalne lub swoiste dla klas operatory operator new i operator delete nie są zgodne z operator new[] i operator delete[], prawdopodobnie wystąpią nieoczekiwane wyniki.
Polegać na niezdefiniowanym zachowaniu jest zawsze bardzo ryzykowne.
Dokładne konsekwencje tej wady są trudne do przewidzenia.Może to spowodować przecieki w klasach z destruktorami, które wykonują zwalnianie pamięci; niespójne zachowanie klas z destruktorami, które wykonują niektórych operacji, gdzie semantyka jest znacząca; lub uszkodzenia pamięci i awarie, gdy operatory zostały zastąpione.W innych przypadkach niezgodność może być nieistotna, w zależności od implementacji kompilatora i jego bibliotek.Narzędzie analizy nie zawsze rozróżnia te sytuacje.
Jeśli pamięć została przydzielona przez tablicę new [], powinna zwykle być zwolniona przez tablicę delete[].
Przykład
Poniższy przykładowy kod generuje to ostrzeżenie:
class A
{
// members
};
void f( )
{
A *pA = new A[5];
// code ...
delete pA;
}
Aby poprawić to ostrzeżenie, należy użyć następującego, przykładowego kodu:
void f( )
{
A *pA = new A[5];
// code ...
delete[] pA;
}
Jeśli obiekt źródłowy w tablicy jest typem pierwotnym takim jak int, float, enum lub wskaźnik, nie istnieją żadne destruktory do wywołania.W takich przypadkach w zamian raportowane jest ostrzeżenie C6283.