[Q] stl::vector 질문
글쓴이: mario / 작성시간: 화, 2003/06/17 - 5:22오후
#include <vector> struct mstc{ int x; }; main(){ vector< mstc *> vvec; for(int x=0;x<5;x++) vvec.push_back(new mstc); }
대단히 초보적인 질문인줄은 알지만 :cry:
요런 코드가 있다고 치죠....
1. 프로그램이 끝나면서 new로 할당된 mstc들이 알아서 해제될까요?
2. vvec.resize(0)는 어떤 작용을 할까요?
3. 적절한 벡터 메모리 해제 방법을 소개해주시면 감사하겠습니다.
Forums:
참고하세요.
1. 프로그램이 끝나면서 new로 할당된 mstc들이 알아서 해제될까요?
되지 않습니다.
해당 소스에 다음과 같이 struct에 생성자와 파괴자만 주었습니다.
그러므로, 명시적으로 삭제해 주세요.
3. 적절한 벡터 메모리 해제 방법을 소개해주시면 감사하겠습니다.
예는 안되겠지만, 이정도 일까요?
삭제 코드 자체를 원하지 않으시면, STL 보다, Boost의
shared_pointer 를 사용하시는 편이 좋을것 같습니다.
2. vvec.resize(0)는 어떤 작용을 할까요?
제 설명 필요 없이 직접 STL을 보시면
간단히 설명 붙이면
vvec.resize(k);
에서 k가 현재 길이보다 크면, 뒷부분에 default costructor로 type을
생성해 넣어주고, 짧다면 뒷부분을 지웁니다.
물론....
vector< mstc *> vvec;
과 같이 사용하지 않고...vector< mstc > vvec;
이렇게 하면 자동으로 해제 됩니다. 그렇지만 제약이 좀 따릅니다. 일반적으로는 pointer를 저장하고 윗분처럼 수동으로 해제합니다.new 나 malloc 으로 힙에 할당한 메모리는 프로세스 종료시 소멸
new 나 malloc 으로 힙에 할당한 메모리는 프로세스 종료시 소멸 됩니다. daemon 같은 프로세스에서는 곤란하지만 간단한 프로그램에서는 상관없습니다. malloc 하고 free 하는 프로그래머로서의 습관이지요. 버릇되니까..
/** 주워 들은 것도 내 것이다. 많이 주워 들어야지*/
Re: 물론....
글쎄요... STL에서는 후자가 정석으로 알고있는데요.
STL 컨테이너는 본래 객체의 컨테이너이지, 포인터의 컨테이너로 설계된 것이 아닙니다.
포인터의 컨테이너는 예외 발생시 메모리 해제 문제가 필연적으로 따릅니다.
포인터의 컨테이너가 필요하다면, C++ 기본 포인터대신 필히 boost::shared_ptr을 쓰세요.
위에 분들이 말씀하시것 처럼...이런 것을 위해서 stl 의 au
위에 분들이 말씀하시것 처럼...
이런 것을 위해서 stl 의 auto_ptr이 존재하는 겁니다.
물론 boost 라이브러리를 쓰는것이 가장 좋지만..
아직 정식 표준은 아니기 때문에 ..
세팅하거나 하는게 귀찮다면 위에 같은 경우는 auto_ptr 을 써도 문제가 없어 보입니다.
하지만 여러 문서에서 언급하는것처럼 auto_ptr 은 주위를 요해서 쓰셔야 합니다..
아닙니다!
STL은 표준 라이브러리의 부분집합이며, auto_ptr은 STL에 속하는 것이 아닙니다.
auto_ptr은 단독으로 사용될 때는 별 문제가 없지만, 배열이나 STL 컨테이너와 함께 써서는 절대 안됩니다!
C++98표준에 따르면, auto_ptr을 원소로 하는 컨테이너(COAP, Container Of Auto_Ptrs)는 아예 컴파일되지 않도록 되어 있습니다.
Re: 저도 동감 합니다.
auto_ptr의 존재 이유가 이해 가지 않을 정도로 사용을 꺼릴수 밖에 없습니다.
참조, 복사, 포인팅 어느것 하나 쓰면서 신경 안쓸수가 없습니다.
Re: 저도 동감 합니다.
그래서 auto_ptr을 쓸때는 아예 소유권 이전이 되지 않도록(되면 에러가 뜨도록) const로 선언하는 것이 좋습니다. 개인적으로 auto_ptr의 소유권이란 개념은 참 골치 아프게하는 요소라고 생각합니다. :?
댓글 달기