|
김상면 님이 쓰신 글 :
: MFC의 경우에는 CFormView가 있습니다.
: 이 클래스는 TForm과 비슷한데
: 제가 경험한 CFormView는 단지 윈도우를 관리하는 클래스였을 뿐이었습니다.
: 무슨 말인가하면
: CFormView* p = new CFormView();
: delete p;
: 라고 한다고 해서 폼이 생성되고 삭제 되는게 아니라 폼을 관리하는 클래스만 생성되고 삭제 되더군요
: 우리가 눈으로 보는 폼의 생성 삭제와는 아무 관계없이....
:
: 그래서 메뉴얼을 둘러보니 이렇게 하라더군요
: CFormView* p = new CFormView();
: p->Create(...);
: p->DestroyWindow();//Destroy이던가 하여튼 잘 모름..
: delete p;
: 처음엔 무슨말인가 몰랐지만 곧 이해가 가더군요
: MFC는 API를 캡슐화한 클래스입니다. 따라서 MFC로 윈도우를 생성하지 못하고
: MFC 클래스의 인스탄스(변수)를 만들고 그 인스탄스에게 윈도우를 생성을 요청하고 ....삭제를 요청.... 이런씩으로 프로그램 되더군요
:
: 그래서 추론을 하나 했습니다. 그럼 이미 만들어진 윈도우를 MFC 클래스에게 관리를 넘기것도 가능하지 않을까...
: 과연 방법이 있더군요
: Attach()
: Detach()
: 첫번째것은 관리를 넘기는것이고 두번째는 그 반대입니다..
:
:
: 님의 경우도 이런 경우가 아닌가 생각합니다.
:
: 그럼
:
:
: 초보짱 님이 쓰신 글 :
: : TForm1을 하나 만들고 그 위에다가 버튼을 하나 올리구요.
: : 버튼을 누르면 새로운 Form2가 뜨도록 했습니다.
: : Form2는 BorderStyle이 bsDialog입니다.
: : 그리고 Form2에는 버튼과 몇개의 VCL 컴포넌트만 올렸죠.
: : 다음은 Form1의 버튼이 Click되었을 때의 코딩입니다.
: : (물론 Form2의 임의의 버튼의 ModalResult를 mrOk로 설정해두었습니다.)
: :
: : 01: void __fastcall TForm1::Button1Click(TObject *Sender)
: : 02: {
: : 03: TForm2 *form2 = new TForm2(this);
: : 04: int result = form2->ShowModal();
: : 05: if (result == mrOk) {
: : 06: MessageDlg("OK", mtWarning, TMsgDlgButtons() << mbOK, 0);
: : 07: }
: : 08:
: : 09: delete form2;
: : 10: }
: :
: : <질문 1>
: : 09번째 line이 없는 경우 Form2의 소멸자는 구현되어 있지 않고,
: : 09번째 line이 있는 경우 Form2의 소멸자에서 명시적으로
: : Form2에 있는 모든 컴포넌트들을 delete했습니다.
: : 그러나 두 경우 다 Form2가 닫힌 후에도 메모리가 해제되지 않았습니다.
: : 왜 그런가요?
: :
: : <질문 2>
: : Form위에 동적생성하지 않은 컴포넌트들을 소멸자나 Close()등에서
: : 명시적으로 delete 해주어야 하나요?
: : 만약, 그렇다면 소멸자는 언제 어떤식으로 호출해주어야 하나요?
: : 만약, 그렇지 않다면 소멸자는 언제 호출되어서 메모리를 해제하나요?
: :
: : 궁금합니다.
: : 고수님들의 답변 부탁드립니다.
: :
1번답... form2의 오우너가 form1 이므로 form1이 죽으면 자동으로 form2도 죽습니다. 그땐 delete form2하지 않아도 죽습니다. 메모리도 안샙니다.(소멸자 호출) 고로 form2안에있는 여러 컴포넌트도 form2가 죽어야 죽습니다. 즉, form1을 종료하시면 정상적으로 모든 컴포넌트들은 죽습니다. - option에 form 메뉴를 보시면 new 로 생성하지 않아도 자동으로 생성 시킬수도 있습니다. - 비추...
2번답... 1번을 잘 읽어 보시면 아실겁니다. owner관계가 성립된 컴포넌트들을 위 처럼 form1이 죽을때 죽이는게 아니라 그 전에 죽여야만 할 경우에는 delete해주셔야 합니다.
|