|
혹시 프로그램내에 DLL을 연동해서 사용하는 부분이 있나요? 빌더로 개발 하신 것 중에서요?
Dynamic_RTL을 사용하면 어플리케이션과 DLL들이 모두 같은 RTL 을 사용하게 됩니다. 메모리 관리 유닛을
하나를 서로 돌려가면서 사용하기 때문에 어플리 케이션과 DLL이나 기타 다른 빌더로 개발된 컴퍼넌트?
들과 서로 메모리 할당과 해제가 동일한 RTL 을 통해 이루어 지기때문에 정상적으로 개발 했다면 릭이 발생할
특별한 이유는 없습니다만 Static RTL 을 사용 했다고 하면 각각 DLL이나 어플리케이션 컴퍼넌트 등이 동립적인
RTL을 가지게 됩니다 예를들면 어플리케이션이 A라는 메모리를 할당했다고 하면 DLL에서 A라는 메모리의 제거를
시도 했다면 실패 하는거죠.. 그래서 릭이 발생 할 수 있습니다. 컴퍼넌트도 마찬가지 일거 같네요.. 상호 생성 제거
되는 메모리중 일부가 Static RTL 로 인해 제거할수 없게 된 부분 같아 보입니다. 그부분을 일일이 찾아서 고치던지
아니면 Dynamic_RTL 을 사용하시는게 현명한 방법 같아 보입니다.
정리하자면 컴퍼넌트가 어플리케이션에게 A라는 기능의 생성을 호출 했다면 어플리케이션의 RTL에서 A내부에
특정 메모리를 할당 했을때, 컴퍼넌트가 A내부의 포인터를 직접 사용하고 있다고 하고 컴퍼넌트가 제거 될때
그 부분을 자기가 직접 제거 하려 시도 했다면 서로 다른 RTL로 인해 제거는 실패되고 결국 어플리 케이션에 A
내부에서 생성된 메모리는 제거되지 않게 됩니다.
레이 님이 쓰신 글 :
: 궁금한 사항이 있어서, 이렇게 질문하게 되었습니다.
:
: 런타임 컴포넌트를 제작하고 있습니다.
: 그리고 그 컴포넌트를 사용하는 샘플 프로그램도 제작했습니다.
:
: 코드가드를 이용해서 메모리 릭을 체크하고 있는데,
:
: (BDS 2007로 작업하고 있습니다)
: Dynamic RTL이 Check 된 상태에서는 정상적으로 동작합니다. 코드가드 로그도 정상이라고 나오구요.
:
:
: 그런데, Dynamic RTL을 Uncheck된 상태에서 프로그램을 실행했다 종료하면,
: 메모리릭이 발생합니다.
:
: Resource leak in process : test.exe(6960) - sys\system.pas#2655
: The Memory block (0x1335120) was never freed
: The Memory block (0x01335120)[size:28 bytes] was allocated with SysGetMem
:
: 특별히 메모리를 할당하는 부분도 없답니다.
: 컴포넌트 자체가 올라가있다는 이유만으로 저런 현상이 발생하는데요,
: 왜 그럴까요?
:
: #pragma comment(lib, "dsound.lib")
:
: 이 부분이 문제가 될 수도 있나요?
: 다이렉트 사운드를 사용하는 컴포넌트입니다.
|