Sdílet prostřednictvím


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.