글수 69
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 같은 함수를 만들어 쓰는 것도 괜찮지 않을까 싶다는 겁니다.
객체를 소멸시키고(소멸자 호출 & 메모리 해제) 그 포인터를 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 같은 함수를 만들어 쓰는 것도 괜찮지 않을까 싶다는 겁니다.
