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.Destruktory nebudou volány.

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

  • Spoléhat na nedefinované chování je vždy velmi riskantní.

Přesné důsledky této vady jsou těžko 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ázka kódu 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.

Použití new a delete má mnoho nástrah v podobě nevracení paměti a výjimek.Chcete-li zabránit těmto druhům problémů úniky a výjimkami 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.