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
[54094] Re:std::list에서 item이 빠져 나갈 때 item 객체를 해제시키는 방법
김태선 [cppbuilder] 2140 읽음    2008-07-25 12:38
STL에서는 어떤 것이 되었던지 객체가 관리하는 내부의 수 많은 포인트에 연결된 객체를 자동으로
해제하려면 따로 해제를 위한 기능을 만들어 사용하셔야 합니다.
그렇지 않다면, 일종의 변형된 기능이 필요하다는 것인데, 팁란에 보시면 TTypedList 같은 객체가 그런 경우입니다.
이는 원하시는 내부 각 아이템의 자동적인 객체 해체를 위해서는 TTypedList와 같은 식의
별도 처리가 필요함을 의미합니다.

STL에서 포인트를 관리하는 경우 STL이 그 객체를 자동으로 해제하지 않는 것은 너무나 당연한 것입니다.
STL에 포인트가 아니라 객체 자체를 넣어 버리면 그 객체는 자동으로 해제합니다.
하지만 이 경우 객체의 사본과 원본에서 소멸자가 2번 실행되거나 또는 한 곳에서는 소멸자가 실행되지 못하거나
또는 한 곳의 메모리가 해제되지 못하는 현상이 발생합니다.
물론 이러한 사실 자체를 모두 알고 있다면 어떤 식으로던지 간에 마음대로 사용할 수 있겠죠.

아마도 STL에 이런 편의를 위한 기능이 부가되어 있거나 확장 list 식의 클래스가 준비되어 있는지는 모르겠으나,
포인트만 대입하여 STL이 관리하는데 포인트가 가르키는 객체가 자동으로 해제되는 현상은
정상적인 일은 아닙니다. 다시 말해 이는 대입되는 것이 포인트라는 전제를 가져야 하기 때문입니다.

아랫분이 스마트 포인트를 말씀하셨는데,
스마트포인트는 객체 자체에 대한 자동 해제를 위한 것이지
지금과 같은 객체가 관리하는 포인트가 가르키는 객체에 대한 자동해제의 경우와는 다릅니다.
다시 말해 적용 가능하지 않습니다.


한가지 주의할 것은 TTypedList는 vector 이지 STL의 list가 아니라는 사실입니다.

TTypedList < Object > *objList = new TTypedList < Object >(true); //

Object* object1 = new Object;
Object* object2 = new Object;

objList->Add(object1);
objList->Add(object2);

delete objList;

이 경우 예제는 위과 같이 구성되어야 합니다. 보시면 아시겠지만, 템플릿에 대한 선언은
클래스 자체로 해 놓고 사용은 그 클래스 객체의 포인트를 대입하는 방법을 씁니다.

이경문님이 쓰신 코드 원문에 보면  std::list<Object*> *objectList;

로 포인트 객체를 선언만 해 놓고 바로 사용하는데 이렇게 하면 바로 에러 만납니다.
  std::list<Object*> *objectList = new std::list<Object*>;

이런식으로 먼저 객체를 할당해야 합니다.

그럼..











이경문 님이 쓰신 글 :
: class Object
: {
: public:
:   Object()          { printf("생성자가 호출되었습니다\n"); }
:   virtual ~Object() { printf("해제자가 호출되었습니다\n"); }
: };
:
: void main()
: {
:   Object* object1 = new Object;
:   Object* object2 = new Object;
:   std::list<Object*>* objectList;
:
:   objectList->push_back(object1);
:   objectList->push_back(object2);
:
:   delete objectList; <- 여기에서 object1, object2를 자동으로 해제하고 싶습니다.
:   // delete object1;
:   // delete object2;
: }
:
: template는 본지 얼마 되지 않아서, 사용하는데 아직 초짜라 질문을 올려 봅니다. std::list를 내부적으로 살펴 보니 call by reference 이더군요. iterator는 그 item의 pointer type을 가지는 것이구요(이것 알아 내는데도 시간이 오래 걸려습니다 ㅠㅠ).
:
: 제가 하고 싶은 것은 list클래스내부에서 item이 빠져 나갈때(erase, pop_back, pop_front 등등), 객체를 해제(destructor를 호출)시켜 주고 싶다는 것입니다.
:
: 물론 item을 빼 낼 때 널리 알려진 메소드(rease, pop_back, pop_front등)을 사용하지 않고, erase_free, pop_back_free, pop_front_free, clear_free 등을 일일이 구현하면 되겠지만, 혼자 다 구현하려고 하니 영 찝찝하다는 생각이 들구요. erase 메소드가 virtual이었다면 이놈을 상속받아서 객체를 해제시켜 주는 코드를 넣으면 좋으련만... 쩝...
:
: std::list 클래스를 사용하려고 하다가, 결국 현재는 자체적인 List 라는 클래스를 만들어서 사용하고 있습니다. 제가 개인적으로 사용하기에는 편하기는 한데, list는 범용적으로 사용된는 클래스라서 가급적이면 표준 library를 사용하고 싶군요.
:
: 질문의 요지는
: 1. list 클래스에서 item 타입은 객체의 pointer이다.
: 2. list 클래스에서 item을 빼 내는 메소드가 호출될 때 옵션(예를 들면 bool autoFree)에 의해서 item의 해제자를 불려 주게 하고 싶다.
:
: 가 되겠습니다. ^^
:
: ps: 데브피아에는 ActiveX 문제때문에 글을 못 올리네요. 짜증나는 데브피아... AcitveX를 걷어 내라, 걷어 내라!!!

+ -

관련 글 리스트
54073 std::list에서 item이 빠져 나갈 때 item 객체를 해제시키는 방법 이경문 1493 2008/07/24
54094     Re:std::list에서 item이 빠져 나갈 때 item 객체를 해제시키는 방법 김태선 2140 2008/07/25
54120         Re:Re:std::list에서 item이 빠져 나갈 때 item 객체를 해제시키는 방법 이경문 1019 2008/07/27
54108         Re:Re:std::list에서 item이 빠져 나갈 때 item 객체를 해제시키는 방법 방콕폐인 1298 2008/07/25
54119             Re:Re:Re:std::list에서 item이 빠져 나갈 때 item 객체를 해제시키는 방법 이경문 982 2008/07/27
54089     Re:std::list에서 item이 빠져 나갈 때 item 객체를 해제시키는 방법 방콕폐인 1325 2008/07/25
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.