Free 와 FreeAndNil의 차이점

 

아래의 예제를 실행하면 정확하게 비트맵이 저장 될까요 ?

 

procedure TForm1.FormCreate(Sender: TObject);

var

  bm: TBitmap;

begin

  bm := TBitmap.Create;

  bm.LoadFromFile('C:\Users\Andreas Rejbrand\Documents\RAD Studio\6.0\Demos\DelphiWin32\VCLWin32\Football\up.bmp');

  bm.Free;

  if Assigned(bm) then

    bm.SaveToFile('C:\Users\Andreas Rejbrand\Desktop\test.bmp')

  else

    ShowMessage('Cannot save! The bitmap does no longer exist!');

end;

Free는 파괴자 Destroy 루틴을 호출하여 메모리에서 해제만 하기 때문에 아래와 같은 예제에서

메모리에서 해제는 되었지만 bm은 여전히 메모리 주소 값을 가지고 있기 때문에 오류 또는 잘못된 (비어있는) 비트 맵이 만들어집니다. 이를 해결하기 위해 bm := nil을 추가 지정할 수 있습니다. 도 다른 방법은 bm.Free 대신에 FreeAndNil(bm); 로 코드를 대치 할 수 있습니다.  

 

freeandnil 프로시저는 개체가 사용하는 메모리를 해제하고 참조변수를 nil로 설정하기 때문입니다.

 

FreeAndNil은 SysUtils 유닛에 선언 된 프로시저이며 Delphi 4에서 도입되었습니다. FreeAndNil 코드는 다음과 같습니다.

procedure FreeAndNil(var Obj);

var

  Temp: TObject;

begin

  Temp := TObject(Obj);

  Pointer(Obj) := nil;

  Temp.Free;

end;

 

실제로 실행은 참조 변수를 먼저 널처리하고  메모리 할당을 해제합니다. 어떤 개발자들은 Free 보다는 FreeAndNil을 사용해야 한다고 주장하지만 개체를 해제하고 그 개체의 인스턴스 변수를 다시 사용하지 않는다면 Free만 사용하셔도 충분합니다. 오히려 FreeAndNil의 정확한 사용 목적을 모르고 해제의 의미로만 사용한다면 소스 코드를 이해하는데 있어서 더 혼동을 가지고 올 수도 있습니다.

 

번호 제목 글쓴이 날짜 조회 수
공지 [DelphiCon 요약] 코드사이트 로깅 실전 활용 기법 (Real-world CodeSite Logging Techniques) 관리자 2021.01.19 15469
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 13972
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 16505
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 22061
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 23273
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 18933
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 39266
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 174729
1263 [동영상강의] 델파이 기본 교육_13.메모장 만들기2 관리자 2012.07.04 6954
1262 [XE3] VCL 이나 FireMonkey 폼을 Metropolis UI로 컨버팅하는 1분 동영상 관리자 2012.09.12 6917
1261 [델파이 문법] 프로시저와 함수 #9 file 관리자 2012.08.20 6907
1260 [델파이 문법 시리즈] #6. 제네릭 - 제약조건 file 관리자 2012.03.29 6899
1259 XE5 안드로이드 단말기 연결시 확인사항 file c2design 2013.09.23 6879
1258 [델파이 문법] 클래스와 객체 #12 file 관리자 2012.06.04 6875
1257 파이어몽키용 TMS 그리드의 간략한 소개 백서 관리자 2012.09.26 6867
1256 3줄의 코드로 "움직이는 3D 컬러애벌레" 만들기 관리자 2012.07.12 6864
1255 [델파이 문법] 문법 요소 #4 file 관리자 2012.10.19 6850
1254 [동영상강의] 델파이 기본 교육_15.델파이와 DB연결과 dbExpress 관리자 2012.07.12 6832
1253 [델파이 문법] 클래스와 객체 #9 file 관리자 2012.05.16 6807
1252 [동영상 강의] 델파이 기본 교육_21.트랜잭션처리 관리자 2012.08.10 6790
1251 [델파이 문법 시리즈] #4. 제네릭 - 타입(기반,클래스,인터페이스,레코드,프로시저) file 관리자 2012.03.27 6749
1250 [델파이 문법 시리즈] #5. 제네릭 - 메소드(파라미터,오버로드,타입 호환성) file 관리자 2012.03.28 6739
1249 [델파이 문법] 데이터 타입, 변수 및 상수 #3 file 관리자 2013.02.13 6736
1248 [델파이 문법] 클래스와 객체 #21 file 관리자 2012.07.13 6729
1247 RichEdit 에서 라인과 칼럼을 알아내기 박병일 2011.12.22 6712
1246 C++Builder XE3 파이어몽키 31 비디오(한글자막) 관리자 2013.03.05 6705
1245 델파이 XE 컨버전 가이드 (첨부파일) file 관리자 2012.06.21 6669
1244 안드로이드 - 장비 부팅 시 앱을 자동시작(링크) Humphery 2014.01.15 6638