다음을 통해 공유


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

주석

앞의 코드를 사용 하 여 "메모리 누수"를 검색할 수 있습니다-확보 되지 있지만 사용 가능한 저장소에 할당 된 메모리입니다.전역이 검색을 수행 합니다 를 삭제 수 할당 및 할당 취소 메모리에 연산자 재정의 되었습니다.

참고 항목

참조

연산자 새 함수

새 운영자 (C++)

연산자 (c, + +)를 삭제 합니다.