共用方式為


運算子 delete 函式

會使用動態配置的記憶體 運算子可以使用釋放 刪除運算子。 刪除運算子的呼叫運算子 delete 函式,會釋放回可用集區記憶體。 使用刪除運算子也會產生類別的解構函式 (如果有的話) 來呼叫。

有一些通用和類別範圍運算子 delete 函式。 只能有一個運算子 delete 函式可以定義為指定的類別。 如果有定義,它會隱藏通用運算子 delete 函式。 全域運算子 delete 的任何型別的陣列永遠呼叫函式。

全域運算子 delete 函式,如果宣告,接受單一引數型別的 void *,其中包含要解除配置物件的指標。 傳回的型別是void (運算子 delete 無法傳回值)。 兩種形式存在的類別成員運算子 delete 函式:

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

只有其中一個前述兩種變體可以表示指定之類別。 第一個表單的運作方式如所述全域operator delete。 第二個表單使用兩個引數,前者就是要解除配置的記憶體區塊的指標,而第二個是要解除配置的位元組數目。 第二個表單時特別有用的時機運算子 delete 從基底類別的函式用來刪除在衍生類別的物件。

運算子 delete 函式是靜態的; 因此,它不能是虛擬的。 operator delete函式會如所述,應遵循存取控制成員存取控制

下列範例會示範使用者定義運算子 new運算子 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 為開頭,編譯器支援成員陣列刪除類別宣告中的運算子。 例如:

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

註解

上述程式碼可以用來偵測"記憶體流失 」 — 也就是配置在可用的存放區,但永遠不會釋放的記憶體。 若要執行這項偵測,全域刪除運算子會計算配置及解除配置的記憶體來重新定義。

請參閱

參考

運算子新函式

新運算子 (C++)

刪除運算子 (C++)