运算符删除功能

动态分配使用 运算符使用 删除 运算符,的内存可能被释放。删除运算符调用 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++)