C6279
upozornění C6279: <variable> se alokuje skalárem new, odstraňuje pomocí pole delete []
Toto upozornění se zobrazí pouze v kódu jazyka C++ a označuje, že volání funkce má nekonzistentně přidělenou paměť skalárním operátorem new, avšak uvolněnou operátorem pole delete [].Pokud je paměť alokována skalárem new, měla by být obvykle uvolněna skalárem delete.
Existují nejméně tři důvody, kdy toto pravděpodobně způsobí problémy:
Nejsou vyvolány konstruktory pro jednotlivé objekty v poli, i když destruktory vyvolány jsou.
Pokud globální (nebo specifický pro třídu) operátor new a operátor delete nejsou kompatibilní s operátorem new[] a operátorem delete[], mohou se vyskytnout neočekávané výsledky.
Přesné důsledky této vady jsou těžko odhadnutelné.Protože nejsou vyvolány konstruktory, může dojít k náhodnému chování nebo může dojít k chybě z důvodu použití neinicializované paměti.Nebo může dojít k přidělení paměti a selhání v situacích, kdy jsou operátory přepsány.Ve vzácných případech nemusí být neshoda důležitá.Nástroj pro analýzu v současné době nerozlišuje mezi těmito situacemi.
Příklad
Následující kód generuje toto upozornění:
class A
{
// members
};
void f ( )
{
A *pA = new A;
//code ...
delete[] pA;
}
Pro opravu tohoto upozornění použijte následující kód:
void f( )
{
A *pA = new A;
//code ...
delete pA;
}
Chcete-li zabránit těmto druhům problémů s přidělením zcela, použijte mechanismy, které jsou k dispozici v knihovně C++ STL.Patří mezi ně shared_ptr, unique_ptr a vector.Další informace naleznete v tématu Chytré ukazatele (moderní verze jazyka C++) a Standardní knihovna C++ – referenční dokumentace.