FreeAndNil 함수는, 포인터(TObject의 인스턴스만)를 인자로 받아서,
객체를 소멸시키고(소멸자 호출 & 메모리 해제) 그 포인터를 NULL 포인터로 만들어버리는 유틸리티 함수입니다.

그러니까 간단히 말하자면 C++에 있는 SAFE_DELETE 매크로 정도 되겠네요.
원래는 델파이에 있는 함수입니다.

일단 그 내용을 볼까요?

[code]
// Object Pascal Code
procedure FreeAndNil(var Obj);
var
  Temp: TObject;
begin
  Temp := TObject(Obj);
  Pointer(Obj) := nil;
  Temp.Free;
end;
[/code]

파스칼을 모르더라도 대충 알 수 있는 코드입니다.
그런데 여기서 저같은 초보자들이 보면 신기한(?) 부분이 하나 있습니다.

Pointer(Obj) := nil;
Temp.Free;

포인터를 먼저 NULL로 만들고 그 다음 객체를 제거합니다.
지금와서 스레드 안전 때문에 그랬을지도 모른다는 추측을 해봅니다만... ^^

아무것도 모를 때는 그저 먼저 NULL 대입하고 제거하는게 신기했을 따름이었죠.

그나저나 이걸 C++ 버전으로 만들어봤습니다...

[code]
template <class T>
inline void FreeAndNil(T& Obj)
{
        void *Temp;

        Temp = Obj;
        Obj = NULL;
        delete Temp;
}
[/code]


그냥 뻘짓이군요 -_-;
뭐 그렇지만 컴파일러가 의도를 알아채고 릴리즈 빌드할 경우, 역시 함수 호출을 씹습니다(!).
인라인 함수의 위력이 대단하군요.


결론은, 이제 컴파일러를 믿고 매크로로 SAFE_DELETE를 쓰는 대신, 인라인 함수로 FreeAndNil 같은 함수를 만들어 쓰는 것도 괜찮지 않을까 싶다는 겁니다.