|
이용태 님이 쓰신 글 :
: 스플릿터를 핸들링 할 수 있는 클래스를 만들어 놓고.. 이 클래스를 벡터에 넣어서 관리를 할려고 합니다.
:
: 그런데 자꾸 에러가 나네요.. 왜 그런지 모르겠습니다.
:
: 일단 스플릿터를 핸들링하는 클래스는 아래와 같습니다.
:
: 여기서 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하지 않으면 됩니다.
이 것 외에는 특이점이 잘 보이질 않는군요.
|