C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[17892] Re:질문 2가지입니다.
유영인 [Chris] [cuperido] 1584 읽음    2002-04-24 11:38
1. 동적할당과 RAD 툴과의 관계
이건 보는 관점에 따라 틀려지는 문제 같습니다. 우리가 흔히 말하는 동적 할당이라는 것은, 아래와 같은 코드를 소스에 삽입시켜 디자인시에 넣는 것을 뜻합니다.

TPanel* panel = new TPanel(this);
TLabel* label = new TLabel(this);

하지만, C++ Builder 나 C# 의 경우에는 디자인시에 컴포넌트를 폼 위에 올려놓을 수 있습니다. 이것은 유저가 보기에는 디자인타임 할당이지만, OS 측면에서 볼때는 이것도 또한 C++ Builder 에 의한 동적할당입니다. Spy++ 로 보시면, 디자인 타임에도 클래스를 모두 찾아내는 것을 볼 수 있습니다. 이걸 유저가 이해가 쉽도록 C++ Builder 에서 관리해 주는 것이고, 이 사항은 C# 도 마찬가지 입니다.


2. 뉴스 그룹에 써 놓은 답변은, 궁그미님의 가정을 반론하는 것이고, 저 또한 그렇게 생각합니다.
일단, OWNER와 PARENT 문제는, 생성시에는 OWNER를 넣어 주셔야 합니다.

TPanel* panel = new TPanel(FORM1);

이렇게 OWNER 설정을 해주시면, 동적으로 생성되었다 하더라도, FORM1이 소거될 때 함께 소거됩니다. PARENT는 Panel이 어디 위에 있을지 결정하는 문제입니다. Parent 프로퍼티의 변경으로 변경이 가능합니다.

그리고, 메모리 해제시, C++ Builder 에서는 객체가 있는지 없는지를 판단하고 해제를 하기 때문에, 소스코드에서 임의로 소멸을 시키더라도, 두번째 소멸 코드는 무시되어 넘어갑니다. 하지만, 디자인타임시에 설계를 해 놓은 컴포넌트는 모두 자동으로 소멸되므로, 코드에 일일히 넣는 번거로움은 필요 없겠지요.

하지만, 동적으로 직접 소스코드로 생성된 모든 소스코드는 OWNER가 설정되어있지 않는 한, 직접 모두 소거를 해주어야 합니다.


이런 이론 사항은 프로그래밍을 할 때, 오히려 역효과를 낼 수 있습니다. 철저한 이론도 중요하지만, C++ Builder나 C# 측면에서 접근을 해야 하는 부분이 많다고 생각되네요.



궁그미 님이 쓰신 글 :
: 1. 동적할당과 RAD 툴과의 관계
: VCL 컴포넌트는 동적할당만 가능하다고 알고 있습니다. 그 이유는 VCL이 오브젝트 파스칼로 쓰여있기 때문이구요. (정적할당을 지원하지 않으므로) 그런데, C#에서도 윈도프로그래밍을 할 때 컴포넌트는 동적할당만 가능합니다. 그래서 이러한 동적할당이 RAD툴의 일반적인 제약조건이 아닌가 하는 생각이 들었는데요. 상관관계가 있는지 궁금합니다.
:
:
: 2. contained component의 자동해제
: container 컴포넌트가 contained 컴포넌트를 가질 때 container 컴포넌트가 해제되면 그 안의contained 컴포넌트도 자동으로 해제된다 쓰여있습니다. (C++ Builder 5 Developer's guide) 그런데 저자는 contained 컴포넌트도 명시적으로 해제해주는 것이 좋다라고 합니다. 예를 들어서,
:
: TPanel* panel = new TPanel(this);
: TLabel* label = new TLabel(this);
: label->Parent = panel;
: //explicit release
: delete label;
: delete panel;
:
: "delete label" 이라는 코드는 필요없지만 명시적으로 해주라는 말 같은데요.
:
: a) container 컴포넌트는 OWNER이어야 합니까? PARENT이어야 합니까? contained 컴포넌트의 메모리해제를 담당하는 것이 어느 것인지 알고 싶습니다.
: b) 만일 프로그래머가 명시적으로 해제코드를 명시하면 빌더에서 자동으로 삽입하는 해제코드와 중복되지 않나요? 즉, 위예에서 panel의 소멸자에 delete label이라는 코드가 들어가 있지 않을까요? 그렇다면 이중 해제가 되지 않을까 해서요. 문제가 없을까요?
: c) 이 부분에 대해 뉴스그룹에 질문을 올렸는데요. 어떤 분이 답변을 해 주셨는데 이해가 잘 안되네요. 설명 좀 부탁합니다.
: [질문]
: In the book, it is written that the contained component is also released
: automatically when containing component is released.
:
: 1. The containing component is OWNER? or PARENT?
: 2. A programmer can release the contained component explicitly.
:
: TPanel* panel = new TPanel(this);
: TLabel* label = new TLabel(this);
: label->Parent = panel;
: //explicit release
: delete label;
: delete panel;
:
: if the programmer   does, i'm afraid that the code, generated automatically
: by C++ Builder   for releasing contained component, will conflict with the
: code that programmer specified explicitly.
: Is it true?
:
: [답변]
: I'm not certain you are correct. The constructor adds 'this' to a
: list in the owner, it seems reasonable to assume that the destructor
: removes 'this' from the same list, avoiding the possibility of double
: deletion.
:
: In case of   doubt, the solution is obvious: whenever you create components
: at runtime which you want to manage yourself, simply pass the Owner as 0.
:
: foo()
: {
:   std::auto_ptr<TPanel> panel(new TPanel(0));
:   // ...
: }
:
: I find this most useful for non-visual components that I use for database
: access in multiple threads, but also use it for forms not created
: automatically.
:
:
: Arnold the Aardvark
:

+ -

관련 글 리스트
17884 질문 2가지입니다. 궁그미 841 2002/04/24
17892     Re:질문 2가지입니다. 유영인 [Chris] 1584 2002/04/24
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.