A라는 클래스는 다음과 같다.
class A
{
A() { ... }
~A() { ... }
private:
Packet pac; // Packet 클래스의 소멸자에서는 자원을 해제해 줌
public:
GetPacket()
{
return pac;
}
}
pac는 Packet형 함수이고, GetPacket 함수는 그 pac 함수를 return 하는 함수이다.
그리고 다음과 같은 Test case를 작성해 보았다.
A a;
CuAssert( test, "Testing!", a.GetPacket().GetLength() );
CuAssert( test, "Testing!", a.GetPacket().GetIsLoaded() );
...
그런데 포인터 관련 에러가 나는 것이다.
1시간여간의 디버깅 삽질 후에 밝혀 낸 것은..
첫 번째 CuAssert() 를 빠져가가면서 GetPacket() 함수를 통해 얻어진 Packet 객체는 Scope out이 되어 소멸자를 호출하고
두 번째 CuAssert() 를 빠져가가면서도 소멸자를 호출하고..
이런 식으로 소멸자를 계속 호출하게 된다.
소멸자에서는 할당한 자원을 해제하는 코드가 들어 있는데, 이와 같이 실제 객체는 소멸되지 않은 상황에서 소멸자만 줄기차게 호출을 하게 되므로 해제한 자원을 또 해제하려 하여 에러가 발생한 것이다.
이런 상황에서는 다음과 같이 하면 될 것 같다..
...
A a;
Packet pac = a.GetPacket();
CuAssert( test, "Testing!", pac.GetLength() );
CuAssert( test, "Testing!", pac.GetIsLoaded() );
...
이렇게 하여 pac 객체가 scope-out 되지 않도록 하면 될 듯 하다.
사소한 버그지만, 마음이 급해지면 찾아내기 힘든 상황이라서 적어 보았다.
class A
{
A() { ... }
~A() { ... }
private:
Packet pac; // Packet 클래스의 소멸자에서는 자원을 해제해 줌
public:
GetPacket()
{
return pac;
}
}
pac는 Packet형 함수이고, GetPacket 함수는 그 pac 함수를 return 하는 함수이다.
그리고 다음과 같은 Test case를 작성해 보았다.
A a;
CuAssert( test, "Testing!", a.GetPacket().GetLength() );
CuAssert( test, "Testing!", a.GetPacket().GetIsLoaded() );
...
그런데 포인터 관련 에러가 나는 것이다.
1시간여간의 디버깅 삽질 후에 밝혀 낸 것은..
첫 번째 CuAssert() 를 빠져가가면서 GetPacket() 함수를 통해 얻어진 Packet 객체는 Scope out이 되어 소멸자를 호출하고
두 번째 CuAssert() 를 빠져가가면서도 소멸자를 호출하고..
이런 식으로 소멸자를 계속 호출하게 된다.
소멸자에서는 할당한 자원을 해제하는 코드가 들어 있는데, 이와 같이 실제 객체는 소멸되지 않은 상황에서 소멸자만 줄기차게 호출을 하게 되므로 해제한 자원을 또 해제하려 하여 에러가 발생한 것이다.
이런 상황에서는 다음과 같이 하면 될 것 같다..
...
A a;
Packet pac = a.GetPacket();
CuAssert( test, "Testing!", pac.GetLength() );
CuAssert( test, "Testing!", pac.GetIsLoaded() );
...
이렇게 하여 pac 객체가 scope-out 되지 않도록 하면 될 듯 하다.
사소한 버그지만, 마음이 급해지면 찾아내기 힘든 상황이라서 적어 보았다.
