Aracılığıyla paylaş


C6278

uyarı C6278: <variable> dizi new [] ile ayrılır, ama skalar sil ile silinir.Yok ediciler çağrılmayacaktır.

Bu uyarı yalnızca C++ kodunda görüntülenir ve çağıran işlevin tutarsız olarak dizi new [] işleci ile bellek ayırdığını, ama onu skalar delete işleci ile serbest bıraktığını gösterir.Bu C++ standardına ve Microsoft Visual C++ uygulamasına göre tanımlanmamış davranıştır.Bunun sorunlara neden olabileceğine dair en az üç neden vardır:

  • Dizi içindeki tek tek nesneler için oluşturucular çağırılır, ama yok ediciler çağırılmaz. 

  • Eğer genel ya da sınıfa özel operator new ve operator deleteoperator new[] ve operator delete[] ile uyumlu değilse, beklenmeyen sonuçlar oluşabilir.

  • Tanımlanmamış davranışa dayanmak her zaman için çok risklidir.

Bu hatanın tam etkilerini tahmin etmek zordur.Bellek serbest bırakımı gerçekleştiren yok edicilere sahip sınıflar için sızıntılara, bazı anlamsal olarak önemli işlemler gerçekleştiren yok edicilere sahip sınıflar için tutarsız davranışa, ya da işleçler geçersiz kılındığında bellek bozulmalarına ve çökmelerine neden olabilir.Diğer durumlar için derleyicinin ve kütüphanelerinin uygulamasına göre bu eşleşmeme önemli olmayabilir.Çözümleme aracı her zaman bu durumlar arasında ayrım yapamaz.

Eğer bellek dizi new [] ile ayrıldıysa, genellikle dizi delete[] ile serbest bırakılmalıdır.

Örnek

Aşağıdaki örnek kod bu uyarıyı oluşturur:

class A
{
  // members
};

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

Bu uyarıyı düzeltmek için aşağıdaki örnek kodu kullanın:

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

Eğer dizi içindeki alt nesne int, float, enum ya da pointer gibi temel bir tür ise, çağırılacak yok edicileri yoktur.By gibi durumlarda onun yerine uyarı C6283 bildirilir.