[완료] STL List에 동적 할당하는 멤버 변수 추가시...
글쓴이: mg2000 / 작성시간: 금, 2008/04/25 - 12:29오후
제가 A라는 클래스를 만들고, 그 안에 문자열을 저장하고 싶어서, 아래와 같이 만들었습니다.
class A { private: char *str; public: A() { str = NULL; } void SetStr(char *s) { if (str != NULL) { free(str); str = NULL; } str = (char *)malloc(sizeof(char) * strlen(s)); strcpy(str, s); } char *GetStr() { return str; } ~A() { free(str); } A& operator=(const A& cA) { SetStr(cA.GetStr()); return *this; } }
이러한 클래스를 List로 저장하고 싶어서, STL의 list를 이용했는데요.
list<A> *listA = new list<A>(); A a; a.SetStr("Kim"); listA.push_back(a);
요렇게 추가하도록 했는데요.
제 생각에는 a를 list에 넣을때, 할당 연산자를 이용해서 클래스 값을 가져올테니, list에 저장되는 A의
str값도 새로 메모리 할당을 하여 복사를 하겠지? 라고 생각을 했는데, operator=부분을 실행을 하지 않더라고요.
그래서 이부분이 있는 함수가 종료가 되면, a의 소멸자가 실행되면서, 할당한 값이 날라가서, list에 들어있는
A의 str값도 사용할 수 없게 됩니다. ㅠ.ㅠ
제가 잘못 이해하고 있는 부분이 있나요?
a도 new로 만들어서 넣어줘야 하는건지....
이런 경우에는 어떻게 구현을 해줘야 할까요?
Forums:
복사생성자와
복사생성자와 대입연산자가 각각 어느 때에 쓰이는지 공부하세요.
임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin
[예진아씨 피카사 웹앨범] 임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin
원래...STL에서는
원래...STL에서는 객체를 저런식으로 다룹니다. ㅡ.ㅡ;;
(생성자, 소멸자가 계속 불리겠죠?)
그걸 해결하려면...글쎄요. 포인터를 담는 형식으로 하셔야 될듯한데...또 포인터는 담아봐야 자동해제가 까다롭죠.
추천은 boost의 smart ptr을 사용하시는게 좋을것 같네요.
(boost에는 그거말고도 포인터용으로 쓸만한 STL 호환되는 list같은것도 제공됩니다)
-----------------------------------------
Let`s Smart Move!!
http://kalstein.tistory.com/
------------------------------------------
Let`s Smart Move!!
http://kalstein.tistory.com/
mg2000님께서 예상하지
mg2000님께서 예상하지 못한 결과가 나온 이유는 imyejin님의 말씀대로 복사생성자와 대입연산자에 대해 알아보시면 답이 나올 듯하구요...
그보다 특별한 이유가 있어서 std::string을 쓸수 없는 상황이 아니라면 char*대신에 std::string을 쓰시길 추천합니다.
std::string은 이미 복사 생성자가 구현되어있기 때문에 A 클래스에서 따로 복사생성자를 구현하지 않더라도 자동으로 복사됩니다.
답변감사합니다.
STL을 처음 쓸려고 하다보니, 이것저것 모르는게 많이 튀어나오는군요. ^^;;;;;;
C++ 공부도 좀 더 해야하겠고요..
답변주신 분들 모두 감사드립니다.
댓글 달기