Aracılığıyla paylaş


işleç silme işlevi

Kullanarak dinamik olarak ayrılan bellek Yeni işleci kullanarak serbest bırakılan silmek işleci.Delete operatörü çağrıları operatörü silmek işlevi kullanılabilir havuzuna belleği boşaltır.Kullanarak silmek işleci de neden sınıf yıkıcı (varsa) çağrılacak.

Genel ve sınıf kapsamı vardır işletmeni silmek fonksiyonlar.Tek bir işletmeni silmek işlevi için verilen bir sınıf; tanımlanabilir tanımlı, genel gizler işletmeni silmek işlevi.Genel işletmeni silmek işlevi her zaman her türlü diziler için denir.

Genel işletmeni silmek işlev, bildirilen, tek bir bağımsız değişken türü alır void *, serbest bırakmak için nesneyi gösteren bir işaretçi içerir.Dönüş türü olan void (işletmeni silmek değer döndürülemez).İki sınıf üyesi var işletmeni silmek işlevleri:

void operator delete( void * );
void operator delete( void *, size_t );

Yukarıdaki iki türevleri yalnızca biri için belirli bir sınıf bulunabilir.İlk form için açıklandığı gibi çalışır genel operator delete.İkinci form ilk serbest bırakmak için bellek bloğu için bir işaretçi ve ikinci ayırması için bayt sayısı iki baðýmsýz deðiþken, alýr.İkinci formu ne zaman son derece yararlı bir işletmeni silmek işlevi temel sınıfından türetilmiş bir sınıf, bir nesneyi silmek için kullanılır.

İşletmeni silmek işlevi statik; Bu nedenle, sanal olamaz.operator delete Açıklandığı gibi işlev obeys erişim denetimi Üye erişim denetimi.

Aşağıdaki örnek, kullanıcı tanımlı gösterir Yeni işleç ve işletmeni silmek tahsisleri ve bellek deallocations oturum için tasarlanmış işlevleri:

Örnek

// spec1_the_operator_delete_function1.cpp
// compile with: /EHsc
// arguments: 3
#include <iostream>
using namespace std;

int fLogMemory = 0;      // Perform logging (0=no; nonzero=yes)?
int cBlocksAllocated = 0;  // Count of blocks allocated.

// User-defined operator new.
void *operator new( size_t stAllocateBlock ) {
   static int fInOpNew = 0;   // Guard flag.

   if ( fLogMemory && !fInOpNew ) {
      fInOpNew = 1;
      clog << "Memory block " << ++cBlocksAllocated
          << " allocated for " << stAllocateBlock
          << " bytes\n";
      fInOpNew = 0;
   }
   return malloc( stAllocateBlock );
}

// User-defined operator delete.
void operator delete( void *pvMem ) {
   static int fInOpDelete = 0;   // Guard flag.
   if ( fLogMemory && !fInOpDelete ) {
      fInOpDelete = 1;
      clog << "Memory block " << cBlocksAllocated--
          << " deallocated\n";
      fInOpDelete = 0;
   }

   free( pvMem );
}

int main( int argc, char *argv[] ) {
   fLogMemory = 1;   // Turn logging on
   if( argc > 1 )
      for( int i = 0; i < atoi( argv[1] ); ++i ) {
         char *pMem = new char[10];
         delete[] pMem;
      }
   fLogMemory = 0;  // Turn logging off.
   return cBlocksAllocated;
}

Visual C++ 5.0 ile başlayarak, derleyici dizi üyesi destekleyen Yeni ve silmek Sınıf bildirimindeki operators.Örne?in:

// spec1_the_operator_delete_function2.cpp
// compile with: /c
class X  {
public:
   void * operator new[] (size_t) {
      return 0;
   }
   void operator delete[] (void*) {}
};

void f() {
   X *pX = new X[5];
   delete [] pX;
}

Açıklama

Önceki kod, "bellek sızıntısı" algılamak için kullanılabilir — boş Deposu'nda ayrılan ancak hiçbir zaman serbest bellek.Bu, genel saptaması için Yeni ve silmek operatörler yeniden sayım ayırma ve bellek ayırmayı kaldırma.

Ayrıca bkz.

Başvuru

Operatör yeni işlev

Yeni işleç (C++)

delete operatörü (C++)