c++ ) 함수에서 오브젝트를 리턴할 때 자동으로 삭제되어 리턴이 되지 않는 문제
글쓴이: poerty / 작성시간: 목, 2016/05/12 - 3:51오전
linked list를 작성하고 있는데
+=, = operator를 작성하였고 정상적으로 동작하는 것도 확인하였습니다.
그 후 + operator를 작성하는데
unvlist unvlist::operator+(const unvlist &ul){ NodeBase *tmp, *ttmp, *tttmp; unvlist *list = new unvlist(); *list = *this; *list += ul; return *list; }
와 같이 작성하니 이유를 모를 메무리 누수(12byte)
Detected memory leaks!
Dumping objects ->
{216} normal block at 0x0122B298, 12 bytes long.
Data: < 8 " " > 05 00 00 00 38 B3 22 01 D0 B4 22 01
Object dump complete.
가 일어나는데 아마 *list를 함수안에서 생성 한 후 delete하는 과정이 없어서 그런 것 같아
unvlist unvlist::operator+(const unvlist &ul){ NodeBase *tmp, *ttmp, *tttmp; unvlist list = unvlist(); list = *this; list += ul; return list; }
와같이 작성하였는데
unvlist l = unvlist(), ll=unvlist(); l = *l1; l += *l2; ll = *l1 + *l2;
를 실행하면 l같은 경우 정상적으로 작동하나 ll = *l1 + *l2
를 실행하는 순간 operator=에서 오류가 납니다
원인은 *l1 + *l2 가 Size는 정상적으로 들어가지만 나머지 노드들이 하나도 들어가지 않습니다.(NULL)
operator+ 함수 내에서 확인해 보니 리턴 전까지는 정상적으로 동작합니다.
아래는 제 destructor함수입니다
unvlist::~unvlist(){ clear(); // free(this); } void unvlist::clear(){ NodeBase* T = Tail; NodeBase* tmp = Head; NodeBase* ttmp; while (tmp != NULL){ ttmp = tmp->nextNode; delete tmp; tmp = ttmp; } Tail = NULL; Size = 0; }
unvlist class는 다음과 같습니다
class unvlist { private: int Size; NodeBase* Head; NodeBase* Tail; public: unvlist operator+(const unvlist &ul); unvlist& operator=(const unvlist &ul); unvlist& operator+=(const unvlist &ul); bool operator==(const unvlist &ul); bool operator!=(const unvlist &ul); .... }
즉 정리하자면
*l1+*l2의 값이 (operator+에서) return 되기 전에 자동으로 delete되어서 정상적으로 리턴이 되지 않습니다.
원인이 무엇일까요?
저와 비슷한 경우인 것 같아 살펴보았지만 저는 return type을 그냥 type으로 맞게 한 것임에도 오류가 나는 이유를 모르겠어 질문 드립니다.
Forums:
operator= 코드 혹시 좀 보여 주실 수
operator= 코드 혹시 좀 보여 주실 수 있으십니까. 일단 거기부터 의심되는데요.
해결하긴했습니다만
입니다
다만 operator+함수를 클래스 내부펑션이 아닌 외부로 접근하니 해결되었습니다
답변 감사합니다
참, retThis()함순는 그 노드를 재생성하는 함수입니다
(clone이라고 하나요?)
아 바꾼것이 더 있는데 언급을 안했네요
operator+를 바꾼 것보다
복사 생성자를 만들어서 해결되었습니다...
댓글 달기