vector, map에 할당한 메모리해제 방법?

stypr의 이미지

vector,map에서 할당한 메모리를 해제할려면 어떻게 해야 확실하게 해제가 가능할까요?
clear를사용하면 좀 줄어들긴하는데 프로세스가 계속 떠있으면 메모리가 조금씩 계속적으로 늘어나는군요.

확실하게 메모리를 없애는 방법이 뭘까요?

bugiii의 이미지

swap 밖에는 확실한 방법이 없다고 들었습니다. Effective STL 에 소개되어 있습니다.

qufdl113의 이미지

음....

bugiii의 이미지

소멸자를 그렇게 불러도 괜찮은가요?

Testors의 이미지

bugiii wrote:
소멸자를 그렇게 불러도 괜찮은가요?

부른후에 생성자를 다시 불러준다면 괜찮을것 같군요.

소멸자만 부른다음에 그냥 쓰면 낭패.

nachnine의 이미지

저도 저렇게 불러도 되는가 궁금한데요.
표준적인 방법인지 궁금합니다


저렇게하고 나서 바로 써도 되는가를 묻는것이 아닙니다
dectructor를 호출하는 코드라면 당연히 바로쓰면 안되는건 알고 있습니다.

p.s. 그리고 vector나 map에 pointer를 넣은거라면 delete 해줘야됩니다.

qufdl113의 이미지

죄송합니다. :oops:

프로그램 종료해도 프로세스가 죽지않고 메모리가 늘어나는줄 알고 답변을 했습니다.
~vector()는 더이상 vector를 쓰지 않을때 사용해 보시라고 권한 것입니다.
벡터에 있는 자료를 지울때는 윗분들 말씀대로.

1 vt_tmp. clear(); or 2 vt_tmp. erase( vt_tmp.begin(), vt_tmp.end());

를 이용하는게 맞습니다.

STL책에서 확실하게 비우기 위해서, 2번을 권장했던거 같은데 집에가서 찾아 봐야 겠군요.
그리고 제대로 지워졌는지 확인을 하기 위해선.
vt_tmp.empty() 를 호출 해보면 비었는지 남았는지 알 수 있을 것입니다.
또한 벡터에 포인터를 넣으면 Delete확실히 해줘야 하구요.

다음부턴 제대로 성의있게 답변하겠습니다. ㅡㅡ;
:shock:

nachnine의 이미지

글로쓰니 오해가 많이 생기는군요

답변을 잘못했다는뜻이 절대로 아니에요;... 미안하실 필요없어요.

그리고 clear 자체가 erase ( begin() , end() ) 를 호출하는걸로

알고 있습니다.

Testors의 이미지

nachnine wrote:
저도 저렇게 불러도 되는가 궁금한데요.
표준적인 방법인지 궁금합니다


저렇게하고 나서 바로 써도 되는가를 묻는것이 아닙니다
dectructor를 호출하는 코드라면 당연히 바로쓰면 안되는건 알고 있습니다.

자세히 찾아보진 않았지만 destructor 호출은 합법적일 것입니다.

( 대략 찾아봤는데 destructor 호출을 금지되어있다는 내용은 못찾았네요. )

실제 사용 예를 들자면..

placement-new 를 사용해 생성자를 호출한 객체의 경우를 생각해 보시면..

destructor 를 직접 불러주는것이 가장 간편한 방법이겠죠? :)

.
.

소멸자 직접호출이 사용될수 있는 예라면..

  vector<int> v;

  // 소멸자 호출
  v.vector<int>::~vector();

  // 생성자 재호출
  new (&v) vector<int>();

  v.push_back( 1 );
  v.push_back( 2 );
  v.push_back( 3 );

  for( size_t s = 0; s < v.size(); ++s )
  {
    cout << v[s] << endl;
  }
Testors의 이미지

rang2guru wrote:
죄송합니다. :oops:

프로그램 종료해도 프로세스가 죽지않고 메모리가 늘어나는줄 알고 답변을 했습니다.
~vector()는 더이상 vector를 쓰지 않을때 사용해 보시라고 권한 것입니다.
벡터에 있는 자료를 지울때는 윗분들 말씀대로.

1 vt_tmp. clear(); or 2 vt_tmp. erase( vt_tmp.begin(), vt_tmp.end());

를 이용하는게 맞습니다.

STL책에서 확실하게 비우기 위해서, 2번을 권장했던거 같은데 집에가서 찾아 봐야 겠군요.
그리고 제대로 지워졌는지 확인을 하기 위해선.
vt_tmp.empty() 를 호출 해보면 비었는지 남았는지 알 수 있을 것입니다.
또한 벡터에 포인터를 넣으면 Delete확실히 해줘야 하구요.

다음부턴 제대로 성의있게 답변하겠습니다. ㅡㅡ;
:shock:

clear() 나 erase() 를 호출하면 size() 는 줄어들겠지만 capacity() 는 줄어들지 않습니다.
원질문자분께서는 '메모리 사용량을 줄이고 싶다' 라고 하셨으므로 capacity() 를 줄이는 방법을 생각해 보아야겠죠.

위에 언급된 Scott Meyers 가 제시한 swap() 을 이용하는 방법도 있겠지만..
소멸자후 다시 생성자를 불러주는것도 유효한 방법이라 생각됩니다.

아래 예는 0, 1, 0, 2 를 출력합니다.
(플랫폼에 따라서 1,2 는 더 큰 수가 될 수도 있습니다. 원소 삽입시에 reserve 되는 크기는 정의되어 있지 않으니 더 크게 잡을수도...)

  vector<int> v;

  cout << v.capacity() << endl;

  v.push_back( 1 );

  cout << v.capacity() << endl;

  v.vector<int>::~vector();
  new (&v) vector<int>();

  cout << v.capacity() << endl;

  v.push_back( 1 );
  v.push_back( 2 );

  cout << v.capacity() << endl;
Testors의 이미지

nachnine wrote:

글로쓰니 오해가 많이 생기는군요

답변을 잘못했다는뜻이 절대로 아니에요;... 미안하실 필요없어요.

그리고 clear 자체가 erase ( begin() , end() ) 를 호출하는걸로

알고 있습니다.

MS Visual Studio .Net 의 vector.clear() 는 erase( begin(), end() ) 를 호출하지 않더군요.

물론 .Net STL 의 버그겠지요. ^^

.Net 쓰시는분들은 참고하시길..

참조 : http://gpgstudy.com/forum/viewtopic.php?t=2798

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.