operator delete 関数
新規作成 の演算子を使用して動的に割り当てられるメモリは 削除 の演算子を使用して解放できます。削除操作は使用できるプールによるメモリを解放する operator delete の関数を呼び出します。 削除 を使用して演算子はクラスのデストラクター (1 の場合) が呼び出されます。
クラス スコープの operator delete のグローバル関数と関数があります。operator delete の 1 種類の関数が特定のクラスに定義できます。; が定義されている場合operator delete のグローバル関数を非表示にします。グローバルの operator delete の関数はあらゆる型の配列の場合に必ず呼び出されます。
operator delete のグローバル関数は宣言されている場合はオブジェクトに解放するへのポインターを含む void* 型の引数を受け取ります。戻り値の型は void (operator delete は値を返すことができません)。2 とおりの形式はクラス メンバーの operator delete の関数用です :
void operator delete( void * );
void operator delete( void *, size_t );
先行する 2 とおりのバリアント 1 のうち特定のクラスになる場合があります。最初の形式はグローバル operator delete で説明されているように動作します。2 番目の形式はを解放するバイト数がある場合はポインターを解放するメモリ ブロックに2 番目のいずれかに 2 個の引数を初めになります。2 番目の形式は派生クラスのオブジェクトを削除するには基本クラスから operator delete の関数を使用する場合に特に便利です。
operator delete のは静的関数で ; したがって仮想にすることはできません。operator delete の関数は アクセスコントロール に説明されているようにアクセス制御とはです。
次の例ではユーザー定義の new 演算子 はoperator 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;
}
コメント
前のコードが 「 - 」メモリ リークの空きストアに割り当てられた後解放されていないつまりメモリを検出するために使用できます。この検出を実行するには 削除 のグローバル 新規作成 および演算子はメモリの割り当てと解放をカウントするように再定義されています。