Sdílet prostřednictvím


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ěno 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 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.

Přesné důsledky této vady jsou těžké 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 přidělenou 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;
}