共用方式為


operator delete 函式

使用 new 運算子動態配置的記憶體可以使用 delete 運算子加以釋放。 delete 運算子會呼叫 operator delete 函式,該函式會將記憶體釋放回可用的集區。 使用 delete 運算子也會呼叫類別解構函式 (如果有的話)。

operator delete 函式的範圍有全域和類別範圍。 特定類別只能定義一個 operator delete 函式,如果已定義,則會隱藏全域 operator delete 函式。 任何類型的陣列一定會呼叫全域 operator delete 函式。

如果宣告全域 operator delete 函式,則會採用類型為 void * 的單一引數,表示其中包含要解除配置的物件指標。 傳回類型為 void (operator delete 無法傳回值)。 類別成員 operator delete 函式存在兩種形式:

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

特定類別只能存在前兩個變數的其中一個。 第一種形式的運作方式如針對全域 operator delete 所述。 第二種形式接受兩個引數,第一個是解除配置記憶體區塊的指標,第二個是要解除配置的位元組數目。 使用來自基底類別的 operator delete 函式刪除衍生類別的物件時,第二種形式特別有用。

operator delete 為靜態函式,因此不能為虛擬。 operator delete 函式會遵守存取控制項,如成員存取控制中所述。

下列範例說明使用者定義的 operator newoperator delete 函式,這兩個函式是針對記錄記憶體的配置和解除配置所設計:

範例

// 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 開始,編譯器在類別宣告中支援成員陣列 newdelete 運算子。 例如:

// 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;
}

Comment

上述程式碼可用來偵測「記憶體流失」,即是在可用存放區中配置但從未釋放的記憶體。 要執行此項偵測時會重新定義全域 newdelete 運算子以計算記憶體的配置和解除配置。

請參閱

參考

operator new 函式

new 運算子 (C++)

delete 運算子 (C++)