C6278
upozornění C6278: Proměnná <variable> se alokuje pomocí operátoru pole new [], ale je odstraňována skalárním operátorem delete.Destruktor nebude volán.
Toto upozornění se zobrazí pouze v kódu jazyka C++ a označuje, že volání funkce má nekonzistentně přidělenou paměť operátorem pole new[], avšak uvolněnou skalárním operátorem delete.To je podle standardu jazyka C++ a implementace prostředí Microsoft Visual C++ nedefinované chování.Existují nejméně tři důvody, kdy toto pravděpodobně způsobí problémy:
Jsou vyvolány konstruktory jednotlivých objektů v poli, ale destruktory vyvolány nejsou.
Pokud není globální nebo specifický pro třídu operátor new a operátor delete kompatibilní s operátorem new[] a operátorem delete[], mohou se vyskytnout neočekávané výsledky.
Spoléhat na nedefinované chování je vždy velmi riskantní.
Přesné důsledky této vady jsou těžké odhadnutelné.U tříd s destruktory, které provádějí uvolnění paměti může docházet k únikům paměti, u tříd s destruktory, které provádějí některé sémanticky významné operace může docházet k nekonzistentnímu chování nebo může docházet k poškození paměti a pádům aplikace, pokud jsou přepsány operátory.V ostatních případech může být neshoda nevýznamná v závislosti na implementaci kompilátoru a jeho knihoven.Analytický nástroj tyto situace nemůže rozlišit vždy.
Pokud je přidělena paměť pomocí operátoru pole new [], měla by být obvykle uvolněna pomocí operátoru pole delete [].
Příklad
Následující ukázkový kód generuje toto upozornění:
class A
{
// members
};
void f( )
{
A *pA = new A[5];
// code ...
delete pA;
}
Pro opravu tohoto upozornění použijte následující ukázkový kód:
void f( )
{
A *pA = new A[5];
// code ...
delete[] pA;
}
Pokud je objekt v poli primitivní typ, jako jsou typy int, float, enum nebo ukazatel, nevolají se žádné destruktory.V těchto případech je namísto toho hlášeno upozornění C6283.