|
: : 임펠리테리입니다.
: :
: : 어디서 Free() 함수의 선언을 보셨는지?
: : Free() 멤버함수는 직접 호출해서는 안되는 함수입니다. 이 함수는 원래 파스칼버전 VCL의 파괴자
: : (destructor)입니다. 파괴자는 직접 호출해서는 안되는 거 아시죠?
: :
:
: : Release() 함수는 폼의 이벤트핸들러 내에서 폼을 파괴하려고 할 때 쓰이는 함수입니다.
: : 폼의 이벤트 핸들러는 폼의 멤버함수인데, 여기서 폼을 파괴하기 위해 delete this; 와 같은
: : 코드를 써줄 수가 없으므로 대신 Realse라는 멤버함수를 준비한 것입니다. 이 함수를 호출하면
: : 이벤트핸들러의 나머지 코드가 끝나기를 기다렸다가 폼을 파괴합니다.
: : 하지만, 일반적으로는 Close() 멤버함수를 쓰는 것이 더 일반적입니다.
: :
: : 그럼 참고하시길...
:
: Application->Create(__classid(TForm1),&Form1)
: Form1->ShowModal();
: 모달폼에 close이벤트에 Release()를 해도 메모리에 남아있어서
: 프로그램 Reset을 해주어야만 디버깅이 끝납니다.
: 그래서
: Application->Create(__classid(TForm1),&Form1)
: Form1->ShowModal();
: Form1->Free();
: 로 했더니 메모리가 해제 됩니다. Close()이벤트에서는 Release()를 빼고....
:
임펠리테리입니다.
얼마전에도 비슷한 질문이 올라왔었는데..
"폼을 동적으로 생성할 때는 Application->Create()을 생성해서는 안됩니다."
그래서 완전히 해제가 안되는 겁니다. 동적으로 폼을 생성하는 정상적인 코드는,
Form1 = new TForm1(Application);
입니다. Application->Create()는 정적으로 폼을 생성하는 경우에만 사용되므로, 빌더가 프로젝트
소스 파일에 자동으로 만들어주는 경우외에는 사용해서는 안됩니다.
그럼 참고하시길...
|