예를 들어서 var pData : pointer; 변수에 할당된 메모리를 해제하는데 이것이 멀티 스레드 상황에서 다른 스레드에 의해서 사용 중이라거나, 또는 재사용되면 안되는 경우라고 하겠습니다.  이때 단순히 TLazyRelease.Release(pData)를 하면, 당장 메모리 해제는 일어나지 않지만, 언젠가는 결국 메모리에서 사라집니다.  (실제로는 클래스가 아닌 객체의 메소드를 실행해야 합니다.)


가비지 컬렉션처럼 레퍼런스 카운터 등을 이용하면 그러한 문제들을 쉽게 벗어날 수 있겠지만, TLazyRelease 클래스가 보다 쉽고 직관적이며 성능면에서 이득이 많습니다.  (다소 메모리는 낭비 되겠지만..) 

  • 크기를 지정하지 않으면 1024 개의 원소를 가진 링 버퍼가 생성됩니다.
  • Release(pData )를 실행하면, 링 버퍼에 큐처럼 쌓이게 됩니다.
  • 지정된 크기보다 더 입력되면, 가장 오래 전에 입력된 원소를 삭제하고 메모리도 해제합니다.
  • 삭제된 원소를 아직도 사용하고 있거나 하는 경우에는 당연히 에러가 납니다.  TLazyRelease는 메모리의 사용 시간이 링 버퍼가 소진되는 시간보다 작다고 확신 할 수 있을 때만 사용해야 합니다.  아니면 크기를 키워야 합니다.

Clear() 메소드는 자원을 사용하는 모든 스레드를 멈춘 뒤에 사용하는 것이 좋습니다.  프로그램이 종료 되기 전에 사용 된 메모리를 되돌려 놓기 위한 용도입니다.  실행하지 않아도 알아서 해제는 됩니다.


소스: http://code.google.com/p/ryulib4delphi/source/browse/trunk/XE2/LazyRelease.pas

'RyuLib > RyuLib for Delphi' 카테고리의 다른 글

RyuLib for Delphi 설치  (0) 2013.07.13
LZMA for Delphi  (0) 2013.01.21
LazyRelease - 메모리 해제를 뒤로 미루기  (0) 2012.10.21
JsonFormatter unit 추가  (0) 2012.08.02
A Simple thread class that can change stack size for it  (0) 2012.07.01
DynamicQueue unit  (0) 2012.06.28

Posted by 류종택


티스토리 툴바