[Q] stl::vector 질문

mario의 이미지

#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. 적절한 벡터 메모리 해제 방법을 소개해주시면 감사하겠습니다.
neocoin의 이미지

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;
}

결과는 다음과 같이 생성자만 불립니다. 
나는 생성 되었다.
나는 생성 되었다.
나는 생성 되었다.
나는 생성 되었다.
나는 생성 되었다.
Press any key to continue

그러므로, 명시적으로 삭제해 주세요.
3. 적절한 벡터 메모리 해제 방법을 소개해주시면 감사하겠습니다.
예는 안되겠지만, 이정도 일까요?
for ( vector<mstc* >::iterator i = vvec.begin(); i!= vvec.end(); ++i)
	delete (*i);
vvec.resize(0);

삭제 코드 자체를 원하지 않으시면, 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을
생성해 넣어주고, 짧다면 뒷부분을 지웁니다.
ukira의 이미지

vector< mstc *> vvec;과 같이 사용하지 않고... vector< mstc > vvec; 이렇게 하면 자동으로 해제 됩니다. 그렇지만 제약이 좀 따릅니다. 일반적으로는 pointer를 저장하고 윗분처럼 수동으로 해제합니다.

ajoupark의 이미지

new 나 malloc 으로 힙에 할당한 메모리는 프로세스 종료시 소멸 됩니다. daemon 같은 프로세스에서는 곤란하지만 간단한 프로그램에서는 상관없습니다. malloc 하고 free 하는 프로그래머로서의 습관이지요. 버릇되니까..

/** 주워 들은 것도 내 것이다. 많이 주워 들어야지*/

cedar의 이미지

ukira wrote:
vector< mstc *> vvec;과 같이 사용하지 않고...
vector< mstc > vvec;
이렇게 하면 자동으로 해제 됩니다.
그렇지만 제약이 좀 따릅니다.
일반적으로는 pointer를 저장하고 윗분처럼 수동으로 해제합니다.

글쎄요... STL에서는 후자가 정석으로 알고있는데요.
STL 컨테이너는 본래 객체의 컨테이너이지, 포인터의 컨테이너로 설계된 것이 아닙니다.
포인터의 컨테이너는 예외 발생시 메모리 해제 문제가 필연적으로 따릅니다.
포인터의 컨테이너가 필요하다면, C++ 기본 포인터대신 필히 boost::shared_ptr을 쓰세요.

B00m의 이미지

위에 분들이 말씀하시것 처럼...

이런 것을 위해서 stl 의 auto_ptr이 존재하는 겁니다.

물론 boost 라이브러리를 쓰는것이 가장 좋지만..

아직 정식 표준은 아니기 때문에 ..

세팅하거나 하는게 귀찮다면 위에 같은 경우는 auto_ptr 을 써도 문제가 없어 보입니다.

하지만 여러 문서에서 언급하는것처럼 auto_ptr 은 주위를 요해서 쓰셔야 합니다..

cedar의 이미지

B00m wrote:
위에 분들이 말씀하시것 처럼...

이런 것을 위해서 stl 의 auto_ptr이 존재하는 겁니다.

STL은 표준 라이브러리의 부분집합이며, auto_ptr은 STL에 속하는 것이 아닙니다.

B00m wrote:

물론 boost 라이브러리를 쓰는것이 가장 좋지만..

아직 정식 표준은 아니기 때문에 ..

세팅하거나 하는게 귀찮다면 위에 같은 경우는 auto_ptr 을 써도 문제가 없어 보입니다.

하지만 여러 문서에서 언급하는것처럼 auto_ptr 은 주위를 요해서 쓰셔야 합니다.

auto_ptr은 단독으로 사용될 때는 별 문제가 없지만, 배열이나 STL 컨테이너와 함께 써서는 절대 안됩니다!
C++98표준에 따르면, auto_ptr을 원소로 하는 컨테이너(COAP, Container Of Auto_Ptrs)는 아예 컴파일되지 않도록 되어 있습니다.

neocoin의 이미지

cedar wrote:

auto_ptr은 단독으로 사용될 때는 별 문제가 없지만, 배열이나 STL 컨테이너와 함께 써서는 절대 안됩니다!
C++98표준에 따르면, auto_ptr을 원소로 하는 컨테이너(COAP, Container Of Auto_Ptrs)는 아예 컴파일되지 않도록 되어 있습니다.

auto_ptr의 존재 이유가 이해 가지 않을 정도로 사용을 꺼릴수 밖에 없습니다.
참조, 복사, 포인팅 어느것 하나 쓰면서 신경 안쓸수가 없습니다.

cedar의 이미지

neocoin wrote:
auto_ptr의 존재 이유가 이해 가지 않을 정도로 사용을 꺼릴수 밖에 없습니다.
참조, 복사, 포인팅 어느것 하나 쓰면서 신경 안쓸수가 없습니다.

그래서 auto_ptr을 쓸때는 아예 소유권 이전이 되지 않도록(되면 에러가 뜨도록) const로 선언하는 것이 좋습니다. 개인적으로 auto_ptr의 소유권이란 개념은 참 골치 아프게하는 요소라고 생각합니다. :?

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.