Udostępnij za pośrednictwem


C6278

Ostrzeżenie C6278: <variable> jest przydzielana za pomocą tablicowego operatora new [], ale usuwana za pomocą usuwania skalarnego.Nie zostaną wywołane destruktory

Ostrzeżenie to pojawia się tylko w przypadku kodu C++ i wskazuje, że wywołująca funkcja niespójnie przydzieliła pamięć tablicowym operatorem new [], ale zwolniła go skalarnym operatorem delete.Zgodnie ze standardami C++ i implementacją Microsoft Visual C++, jest to niezdefiniowane zachowanie C++.Istnieją co najmniej trzy powody, dla których może to spowodować problemy:

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

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

  • Polegać na niezdefiniowanym zachowaniu jest zawsze bardzo ryzykowne.

Dokładne konsekwencje tej wady są trudne do przewidzenia.Może to spowodować przecieki w klasach z destruktorami, które wykonują zwalnianie pamięci; niespójne zachowanie klas z destruktorami, które wykonują niektórych operacji, gdzie semantyka jest znacząca; lub uszkodzenia pamięci i awarie, gdy operatory zostały zastąpione.W innych przypadkach niezgodność może być nieistotna, w zależności od implementacji kompilatora i jego bibliotek.Narzędzie analizy nie zawsze rozróżnia te sytuacje.

Jeśli pamięć została przydzielona przez tablicę new [], powinna zwykle być zwolniona przez tablicę delete[].

Przykład

Poniższy przykładowy kod generuje to ostrzeżenie:

class A
{
  // members
};

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

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

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

Jeśli obiekt źródłowy w tablicy jest typem pierwotnym takim jak int, float, enum lub wskaźnik, nie istnieją żadne destruktory do wywołania.W takich przypadkach w zamian raportowane jest ostrzeżenie C6283.