delete 연산자 함수
사용 하 여 동적으로 할당 된 메모리는 새 연산자를 사용 하 여 해제할 수 있습니다의 삭제 연산자입니다.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 연산자 할당 하 고 메모리의 deallocations를 기록 하도록 디자인 된 기능:
예제
// 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;
}
주석
앞의 코드를 사용 하 여 "메모리 누수"를 검색할 수 있습니다-확보 되지 있지만 사용 가능한 저장소에 할당 된 메모리입니다.전역이 검색을 수행 합니다 새 및 를 삭제 수 할당 및 할당 취소 메모리에 연산자 재정의 되었습니다.