2013-05-16 3 views
2

하위 클래스에서 연산자 new/delete가 오버로드되고 있습니다. 그리고 저에게 다소 이상한 것처럼 보이는 동작을 감지하고 있습니다. 비주얼 스튜디오 2010 컴파일 할 때오버로드 된 연산자가 새롭고 일치하는 삭제

#include <stdlib.h> 
#include <stdio.h> 

class Base 
{ 
public: 

    virtual ~Base() 
    { 
    } 
}; 

class Derived : public Base 
{ 
public: 

    void* operator new(unsigned int size, int capacity) 
    { 
     printf("> new(unsigned int, int)\n"); 
     return malloc(sizeof(Derived)); 
    } 

    void operator delete(void* ptr, int) 
    { 
     printf("> delete(void*, int)\n"); 
     free(ptr); 
    } 

    void operator delete(void* ptr) 
    { 
     printf("> delete(void*)\n"); 
     free(ptr); 
    } 
}; 

int main(int argc, char** argv) 
{ 
    Base* base = new (0) Derived(); 
    delete base; 

    return 0; 
} 

이 코드는 다음과 같은 출력을 생성합니다 : 아래의 예제 코드를 살펴

> new(unsigned int, int) 
> delete(void*) 

가 왜 일치 여기라는 가져 오지 연산자 ( Derived::operator delete(void*, int))을 삭제한다? 내가 뭘하든 관계없이 일치하는 연산자를 호출하도록 코드를 가져올 수는 없습니다.

답변

5

기본적인 진언은 :

더 게재 위치 삭제 표현이 없다.

객체를 생성 할 위치 새로운를 사용하는 경우, 수동으로 파괴 한 후 해제 기능을 호출해야합니다 :

Base * p = new (0) Derived; 

p->~Derived(); 

Derived::operator delete(p, 0); 

만약에 당신을, 그것의 delete base; 말을 일종의 정의되지 않은 동작이 당신의 왜냐하면 표준 새 표현식의 결과로 base을 얻지 못했기 때문입니다. 전체적으로 다른 것을 수행하는 배치 (새로운 할당 함수)를 정의하고 표준 operator delete을 호출하면 할당 해제 함수가 전체적인 혼란을 가져올 수 있습니다. 그것은 여러분의 프로그램에서 잘 작동합니다.