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

Viz také

Referenční dokumentace

C6014