this adjustment

MSVC 컴파일러에서 상속시 발생할 수 있는 this 포인터 문제


Callback 인터페이스를 제공하는 클래스를 디자인하던 중 발생한 this 포인터 문제에 대해서 정리하기 위해서 작성하였음. 빌드 환경은 윈도우 + MSVC컴파일러.

this 포인터의 잘못된 참조

목표는 몇 가지 콜백함수를 등록하고, 특정 상황에 맞게 호출할 수 있는 인터페이스를 제공하는 클래스를 디자인하는 것이다. 여러 방법 중 해당 클래스를 상속하여 인터페이스를 이용하는 방식을 선택하였다.

먼저 상속관계에서 콜백을 호출하는 간단한 테스트를 진행하였고, 그 과정에서 문제를 발견하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class ICallback
{
protected:
typedef void(ICallback::* Callback)();

void CallProc(Callback proc)
{
(this->*proc)();
}
};

class Test : public SomeClasses, public ICallback
{
int data{ 10 };
public:
void RegisterFoo()
{
CallProc((Callback)&Test::foo);
}

void foo()
{
printf("%d\n", this->data);
}
};

int main()
{
Test* t = new Test;
t->RegisterFoo();
}
Read more