[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에 생성자와 파괴자만 주었습니다.
#include <vector> #include <iostream> using namespace std; struct mstc{ int x; mstc() { cout << "나는 생성 되었다. " << endl; } ~mstc() { cout << "나는 파괴되었다. " << endl; } }; int main(int argc, char** argv) { vector< mstc *> vvec; for(int x=0;x<5;x++) vvec.push_back(new mstc); return 0; }그러므로, 명시적으로 삭제해 주세요.
3. 적절한 벡터 메모리 해제 방법을 소개해주시면 감사하겠습니다.
예는 안되겠지만, 이정도 일까요?
삭제 코드 자체를 원하지 않으시면, STL 보다, Boost의
shared_pointer 를 사용하시는 편이 좋을것 같습니다.
2. vvec.resize(0)는 어떤 작용을 할까요?
제 설명 필요 없이 직접 STL을 보시면
void resize(size_type _N, const _Ty& _X = _Ty()) {if (size() < _N) insert(end(), _N - size(), _X); else if (_N < size()) erase(begin() + _N, end()); }간단히 설명 붙이면
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의 소유권이란 개념은 참 골치 아프게하는 요소라고 생각합니다. :?
댓글 달기