2010-04-28 2 views
2

C++ 전역 연산자 new에 과부하가 걸릴 수 있는지 테스트하기 위해 VS2005에 작은 프로그램을 작성했습니다. 가능합니다.C++ 전역 연산자 new : 대체 할 수있는 이유

#include "stdafx.h" 
#include "iostream" 
#include "iomanip" 
#include "string" 
#include "new" 

using namespace std; 

class C { 
    public: 
     C() { cout<<"CTOR"<<endl; } 
}; 

void * operator new(size_t size) 
{ 
    cout<<"my overload of global plain old new"<<endl; 
    // try to allocate size bytes 
    void *p = malloc(size); 
    return (p); 
} 

int main() { 
    C* pc1 = new C; 
    cin.get(); 
    return 0; 
} 

위에서 연산자 new에 대한 내 정의가 호출됩니다. 코드에서 해당 함수를 제거하면 C : \ Program Files (x86) \ Microsoft Visual Studio 8 \ VC \ crt \ src \ new.cpp에있는 new 연산자가 호출됩니다.

모두 좋다. 그러나, 내 생각에, new 연산자의 구현은 new.cpp의 new에 과부하가 걸리지 않으며, 그것은 CONFLICTS과 충돌하고 one-definition 규칙을 위반합니다. 왜 컴파일러는 그것에 대해 불평하지 않습니까? 아니면 operator new가 매우 특별하기 때문에 표준이 말하지만 one-definition 규칙은 여기에 적용되지 않습니까?

감사합니다.

+3

구현하는 모든 연산자 new에 대해 항상 'operator delete'를 구현해야합니다. (나는 이것이 단지 당신의 요점을 보여주기위한 것이라는 것을 알고 있지만, 나는이 경고 없이는 자신을 서있을 수는 없다.) – sbi

+1

아마 질문의 제목을 편집해야할까요? 실제로 그것을 대체하는 것이 왜 오류를 일으키지 않았는지 알고 싶을 때. –

답변

7

예, 글로벌 operator new은 프로그램에서 대체 구현을 제공 할 수 있다는 점에서 특별합니다.

대체 할 수있는 양식은 operator newoperator delete의 단일 개체 및 배열 형식이며 "예외 없음"변형입니다. 새로운 배치와 같은 다른 형식은 대체 할 수 없습니다.

+0

일하러 돌아 오십시오 :-) – Simon

+1

@ 시몬 : 점심 시간 :-) –

+0

좋아요, 당신을위한 upvote가 있습니다. – Simon

관련 문제