아젠더 님이 쓰신 글 :
: operator new를 오버라이드 할려고 해봤는데 호출이 아예 안되네요
:
:
: class TSomeClass : public TObject
: {
: public:
: __fastcall TSomeClass(){}
: void * operator new(size_t s)
: {
: OutputDebugStringA("called...."); <===== 호출이 전혀 안됨
: }
: }
:
: void __fastcall TForm1::Button1Click(TObject *Sender)
: {
: TSomeClass *p = new TSomeClass();
:
: }
:
: 방법좀 알려주세요
답변:
C++ 빌더에서 델파이로 구현되어 있는 클래스를 상속 받아 사용할 때, 객체의 메모리 할당 방식을 재정의 해서
사용하고자 한다면...new를 오버라이드해서 사용하는 대신, NewInstance()라는 __classmethod를 오버라이드
해야 합니다.
상속관계가 그럴 경우...
객체를 생성할 때... 델파이가 Virtual Method Table의 Context를 결정하는 방식을.. C++빌더는 그대로 따라야 하고
그래서 C++ 빌더에서 내부적으로 TObject::NewInstance() 클래스 메소드를 이용해서 객체를 생성하기 때문입니다.
class TSomeClass : public TObject
{
public:
__fastcall TSomeClass(){}
__classmethod TObject* __fastcall NewInstance()
{
OutputDebugStringA("called.....");
TObject::NewInstance();
}
};
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TSomeClass *p = new TSomeClass();
}
위와 같은 식으로 __classmethod TObject* __fastcall NewInstance()를 오버라이드 해야 합니다.
|