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
[52529] Re:벡터에 클래스를 넣었는데 멤버 변수 중 하나가 delete 되지 않아요...
[] 1528 읽음    2008-03-04 12:32
이용태 님이 쓰신 글 :
: 스플릿터를 핸들링 할 수 있는 클래스를 만들어 놓고.. 이 클래스를 벡터에 넣어서 관리를 할려고 합니다.
:
: 그런데 자꾸 에러가 나네요.. 왜 그런지 모르겠습니다.
:
: 일단 스플릿터를 핸들링하는 클래스는 아래와 같습니다.
:
: 여기서 TLMD2PaneSplitCtrl 은 LMD 컴포넌트로 상용입니다.
:
: typedef class TVectorDynamicSplitterManageClass
: {
:     private :
:         TLMD2PaneSplitCtrl *m_pSplit;
:         int crNo; //create Number
:
:     public :
:
:         TVectorDynamicSplitterManageClass()
:         {
:             m_pSplit = NULL;
:             crNo = 0;
:         }
:
:         ~TVectorDynamicSplitterManageClass()
:         {
:             if(m_pSplit != NULL)
:             {
:                 delete m_pSplit;
:                 ShowMessage("OK");
:             }
:         }
:
:         void SetSplitter(TLMD2PaneSplitCtrl *pSplit)
:         {
:             m_pSplit = pSplit;
:         }
:
:         TLMD2PaneSplitCtrl* GetSplitter()
:         {
:             return m_pSplit;
:         }
:
:         void SetcrNo(int nNo)
:         {
:             crNo = nNo;
:         }
:
:         int GetcrNo()
:         {
:             return crNo;
:         }
: }TVecSplitMan;
:
:
: 이렇게 만든 클래스를 벡터에 담기 위해 벡터를 선언합니다.
:
: std::vector<TVecSplitMan> vSpliter;
:
: 이렇게 한 후, 동적으로 스필릿터를 생성한 후에 벡터에 담았습니다.
:
:     TLMD2PaneSplitCtrl* pSplit = new TLMD2PaneSplitCtrl(Application);
:
:     pSplit->Parent = XiPanel1;
:
:     pSplit->Align = alClient;
:     pSplit->SplitterMain->Direction = sdHorizontal;
:     pSplit->SplitterMain->Position = pSplit->Height/2;
:
:     TVecSplitMan spvar1;
:     vSpliter.push_back(spvar1);
:     (vSpliter.back()).SetcrNo(0);
:     (vSpliter.back()).SetSplitter(pSplit);
:
: 담는건 잘 됩니다.. 하지만 프로그램을 종료하면 벡터에 담긴 스플릿터를 지우지 못해 에러가 발생합니다.. 클래스의 소멸자 부분에서요..
:
: 디버깅 해보면... 분명 m_pSplit은 NULL 이 아니며 당연히 삭제가 되어야 합니다.. 하지만 delete 할때 에러가 발생하게 되네요...
:
: 에러 메시지는 "Project Project1.exe raised exception class EPrivilege with message 'Privileged instruction'."이겁니다..
:
: 왜 이런 에러가 날까요?
:
: 단순히
: TLMD2PaneSplitCtrl* pSplit = new TLMD2PaneSplitCtrl(Application);
: delete pSplit;
: 이렇게 하면 에러 안납니다.. 하지만 왜.. 벡터에만 들어가면 delete 할때 에러가 발생하는지 도무지 이해가 안갑니다.
:
: 답변 부탁드립니다.

TLMD2PaneSplitCtrl* pSplit = new TLMD2PaneSplitCtrl(Application);
위 코드는 TLMD2PaneSplitCtrl 형의 인스턴스를 하나 생성하면서 그 Owner를 Application으로 지정한 것으로 추측됩니다.
(vSpliter.back()).SetSplitter(pSplit); 할 때
TVecSplitMan 형의 spvar1도 pSplit가 가리키는 인스턴스의 Owner가 됩니다.
Owner의 역할은 자신이 Own한 것을 delete하는 것입니다.
위 코드대로라면 pSplit가 가리키는 인스턴스를 두 번 delete하게 됩니다.
spvar1이 먼저 delete해버리므로 Application이 delete할 때 문제가 됩니다.
추측이 맞다면, TLMD2PaneSplitCtrl(NULL)로 생성하거나 TVecSplitMan 인스턴스에서 m_pSplit을 delete하지 않으면 됩니다.
이 것 외에는 특이점이 잘 보이질 않는군요.

+ -

관련 글 리스트
52516 벡터에 클래스를 넣었는데 멤버 변수 중 하나가 delete 되지 않아요... 이용태 1545 2008/03/03
52529     Re:벡터에 클래스를 넣었는데 멤버 변수 중 하나가 delete 되지 않아요... 1528 2008/03/04
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.