아직 C++빌더의 방식에 익숙하지 않으신 것 같습니다.
C++빌더에서 모든 컴포넌트는, Owner 구조를 이용해서 자동으로 해제가 가능합니다. 그래서 명시적으로 delete를 할 필요가 없습니다.
모든 컴포넌트의 조상인 TComponent 클래스의 생성자를 보면 단 하나의 인자 Owner를 가지고 있으며, 이 Owner로 다른 컴포넌트를 지정해주면 그 컴포넌트가 현재 생성중인 컴포넌트의 메모리 해제를 책임지게 됩니다.
[VCL] Sender, Parent, this, Owner 에 대한 설명
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_faq&no=15
문경재님의 코드에서 메뉴아이템을 생성하는 코드에 보시면 new TMenuItem(Application) 이렇게 하셨으니, Application 객체를 Owner로 지정하신 것입니다. 이것은 객체가 해제될 때 이 메뉴아이템 객체가 덩달아 해제된다는 의미입니다.
폼에 속한 컴포넌트를 생성하면서 Owner로 Application을 지정한 것은 좀 적절하진 않은데요. 애플리케이션이 실행중인 상태에서 이 폼이 중간에 해제될 수도 있는데, 그렇게 되면 이 메뉴아이템은 애플리케이션이 끝날 때까지 계속 메모리를 점유하게 됩니다.
그래서 당연히, 폼에 속한 컴포넌트를 동적 생성할 때는 Owner를 폼으로 지정하는 것이 가장 일반적입니다. 반드시 Owner로 Application을 지정해야 하는 경우도 있는데요, 폼을 동적으로 생성할 때죠.
컴포넌트나 폼을 동적으로 생성할 때 이 Owner를 지정하지 않고 대신 NULL을 넘길 수도 있습니다. 그러면 짐작하시겠지만 누구도 해당 객체의 해제를 자동으로 해주지 않으므로 개발자가 직접 delete로 삭제해야 합니다.
이 Owner 방식은 자바 등의 가비지컬렉션과 좀 비슷한 효과를 갖지만, 가비지컬렉션처럼 느리지도 않고 가비지컬렉션처럼 복잡한 로직으로 동작하지도 않습니다. 심플하고 빠릅니다.
문경재 님이 쓰신 글 :
: 콤보박스에 적혀 있는 갯수만큼 메뉴아이템을 추가해야해서
:
: 콤보박스의 내용이 변경될때마다
:
: //콤보박스만큼돌면서 팝업메뉴에 넣어주기
: for(int i = 0 ; i < AdvComboBox3->Items->Count ; i++)
: {
: TMenuItem * miStatus = new TMenuItem(Application);
: miStatus->Caption = AdvComboBox3->Items->Strings[i];
: PopupMenu1->Items->Insert(i,miStatus);
: }
:
: 이런식으로 했는데요.
:
: 질문1. new를 했으니 어딘가에서 delete를 해줘야할것 같은데 콤보박스가 계속 바뀌어서..어디서 해줘야 할지...
:
: 질문2. 동적으로 만들어진 menuItem을 클릭했을때 이벤트를 발생시키려면 어떻게 해야하는지..
:
:
:
: 감사합니다.~