Udostępnij za pośrednictwem


C6279

Ostrzeżenie C6279: <variable> przydzielona z użyciem skalarnego operatora new, została usunięta z użyciem tablicowego operatora delete[]

Ostrzeżenie to pojawia się tylko w przypadku kodu C++ i wskazuje, że wywołująca funkcja niespójnie przydzieliła pamięć skalarnym operatorem new, ale zwolniła go tablicowym operatorem delete[].Jeśli pamięć została przydzielona skalarnym operatorem new, zazwyczaj powinna zostać zwolniona skalarnym operatorem delete.

Istnieją co najmniej trzy powody, dla których może to spowodować problemy:

  • Konstruktory dla poszczególnych obiektów w tablicy nie są wywoływane, chociaż destruktory są.

  • Globalne (lub swoiste dla klas) operatory operator new i operator delete nie są zgodne z operator new[] i operator delete[], prawdopodobnie wystąpią nieoczekiwane wyniki.

Dokładne konsekwencje tej wady są trudne do przewidzenia.Może spowodować losowe zachowanie lub awarie z powodu użycia niezainicjowanej pamięci, ponieważ konstruktory nie są wywoływane.Może także spowodować alokacje pamięci i awarie w sytuacjach, gdy operatory zostały zastąpione.W rzadkich przypadkach niezgodność może nie być istotna.Narzędzie analizy aktualnie nie rozróżnia tych sytuacji.

Przykład

Poniższy kod generuje to ostrzeżenie:

class A
{
  // members
};

void f ( )
{
  A *pA = new A;
  //code ...
  delete[] pA;
}

Aby poprawić to ostrzeżenie, należy użyć następującego kodu:

void f( )
{
  A *pA = new A;
  //code ...
  delete pA;
}