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 규칙은 여기에 적용되지 않습니까?
감사합니다.
구현하는 모든 연산자 new에 대해 항상 'operator delete'를 구현해야합니다. (나는 이것이 단지 당신의 요점을 보여주기위한 것이라는 것을 알고 있지만, 나는이 경고 없이는 자신을 서있을 수는 없다.) – sbi
아마 질문의 제목을 편집해야할까요? 실제로 그것을 대체하는 것이 왜 오류를 일으키지 않았는지 알고 싶을 때. –