2011-11-13 9 views
1

콘솔 응용 프로그램이 종료 될 때 메모리를 확보하는 가장 좋은 방법은 무엇입니까?콘솔 응용 프로그램 종료시

로드 된 DLL과 내 응용 프로그램에서 사용하는 다른 리소스를 모두 비우고 싶습니다.

나는 메모리 : 나는 구글을 검색 한하지만이 작업을 수행 할 수있는 방법을 찾을 수 없습니다

에 모든 것을 무료로합니다. 나는 그냥 응용 프로그램을 콘솔 내 응용 프로그램에서 장치를 사용하지 않는

응용 프로그램이 직접 또는 델파이 내부 할당에 의해 하나 그것에 의해 할당 된 모든 메모리를 종료

program MyAPP; 

{$APPTYPE CONSOLE} 

uses 
    Windows, SysUtils; 

/// functions 
// procedures 

begin 
end. 
+0

"내 콘솔 응용 프로그램이 종료되면 메모리를 확보하는 가장 좋은 방법은 무엇입니까?" 실제로 아무것도하지 않는 것이 가장 좋다는 좋은 주장이 있습니다. 시스템이 메모리를 회수하도록하십시오 –

답변

7
begin 

    try 
    // Your entire program goes here. 
    finally 
    SomeFunction; 
    end; 

end. 
+1

이것은 종료와 관련이 없습니까? 그냥 무언가를 시도한 다음 마침내 해방하십시오. – user1023395

+2

@ user1023395 : 성취하고자하는 바를 잘 모르겠다. 아마 당신은 조금 더 정련 할 수 있을까요? –

+0

응용 프로그램 종료시 일부 기능을 호출하려고합니다. – user1023395

0

(TObject.Create /의 InitInstance) 또는 모듈에 의해 운영 체제에 의해 해제됩니다.

프로그램이 종료 된 후에도 응용 프로그램 내의 메모리 누수조차도 문제가되지 않습니다. FastMM4 라이브러리를 사용하여 메모리 누수를 확인할 수 있습니다.

Windows는 또한 GDIPlus와 같은 특수 라이브러리에 대한 초기화 호출에 의해 핸들을 얻은 개체를 해제해야하지만 개체 인스턴스가 사용 된 코드의 로컬 범위에서 사용되지 않게 된 후에 수동으로 해제해야합니다.

모든 코드 내 할당 해제의 경우 try..finally를 사용해야합니다. 그래서 program.dpr 이상적과 같습니다 당신은 당신이 만든 개체 것을 보여 주었다하지 않은

program YourProgram; 
{$APPTYPE CONSOLE} 

uses 
    MainUnit; 

var 
    main: TProgramMain 
begin 
    main := TProgramMain.Create; 
    try 
    main.Execute; 
    finally 
    main.Free; 
    end; 
end. 
+0

사용자가 Ctrl + C를 누르면 main.Free가 호출됩니까? – mjn

+0

호출되지 않습니다. (참조 : https://forums.codegear.com/thread.jspa?threadID=15832) – too

0

,하지만 당신은 그 객체를 생성 한대로, 반대는 당신이 원한다면 당신이 그들을 무료 방법이다.

개체가 단순히 힙에서 메모리를 소비하는 경우 Windows에서 프로세스에서 사용하는 모든 메모리를 회수하도록 할 수 있으며이 경우 부작용 (작은 응용 프로그램이없는 경우) 빠릅니다.

그럼에도 불구하고 대부분의 양심적 개발사는 그들이 만드는 모든 물건을 완전히 무료로 선택합니다. 이 같은 개체를 만든 경우 :

x := TMyObject.Create; 

을 ... 당신은 무료 호출하여 무료 : 객체가 부모가 소유 한 구성 요소입니다

x.Free; 

경우, 당신은 할 필요가 없습니다 그것을 해방하십시오.

객체가 인터페이스 된 객체 (참조 계산) 당신은 단순히 이런 참조의 가자 경우 : 문제의 유형은 값 타입 (더블, 정수) 다음 돈이면

x := nil; 

을 그걸 풀어 줘야 해.

문제의 유형이 자동으로 관리되는 경우 (기록, 문자열) 자유롭게 풀 필요가 없습니다.

개체가 더 많은 개체를 할당하는 경우 해당 개체를 소멸시키는 올바른 위치는 해당 개체의 소멸자입니다.

다음은 규칙입니다. 그들을 따라 가면 누출은 없을 것입니다.콘솔 애플리케이션은 지정하지 않은 방식으로 종료됩니다. 당신의 불특정 질문에 대한 어떤 마법의 답변을 기대 했습니까? 그것이 나 였다면 응용 프로그램이 정상적으로 종료되고 정상 종료 중에 자원이 해제된다는 것을 확인했습니다. 비정상적으로 종료되면 작성한 "try..finally"블록이 실행되지 않습니다. 종료 코드를 통해 한 단계 씩 실행하여 전혀 실행되지 않는지 확인하는 것이 좋습니다.

코드 예제를 게시 한 경우보다 구체적인 대답이 가능했을 것입니다.

관련 문제