Vector 와 Dangling Pointer에 대해서...

seagul2의 이미지

vector 클래스를 사용해서 데이타를 삽입시키는데, 이를 바운즈 체커로 검사시에 나타나는 dangling Point에러때문에 고민중입니다. 몇일전에두 이런 글을 올렸었는데, 그때 어느분이 바운즈체커 최신판으로 했을때 에러가 나지 않는다고 하시더군요. 그래서 데브파트너 7.2버전으로 테스트를 해봤습니다. 하지만 마찬가지 이더군요. 현재 툴은 Visual Studio 6.0에 서팩5로 테스트 중입니다.

테스트에 사용한 코드는 아래와 같습니다.
1을 입력시킬때는 문제가 없지만, 2를 입력시킬때 부터 에러가 발생합니다.

vector<int> m_vList; 
m_vList.push_back(1); 
m_vList.push_back(2);

발생하는 에러문구는 다음과 같습니다.
Errors Detected : Dangling Pointer

그렇다구 다음과 같이 데이타를 참조하지 못하는것도 아닙니다.

m_pVList.at(0)
m_pVList[0]

위와 같이 데이타를 불러올때 아무런 문제없이 잘 불러옵니다.
하지만 언제 무슨 문제가 갑자기 발생할지 모르는 생황에서 사전에 이를 해결을 하려고 하는데, 해결이 안되네요.

혹시 이런 문제 격으신 분이나 아시는분 시원한 답변좀 부탁드립니다.

쌀밥의 이미지

보여주신 예만 가지고는 문제를 알 수가 없을듯 합니다.
앞뒤로 뭔가 문제가 일을꺼라고 생각되는데
제 짐작을 말씀 드리면..

앞의 예에서는 m_vList라는 변수명을 사용하셨고
아랬쪽에서는 m_pVList 라는 변수명을 사용하시것으로봐서
local 변수를 member 변수로 할당해서 사용하고 계신가 아닌가 생각됩니다.

m_pVList = & m_vList;
이렇게 쓰면 문제가 생길 수 있습니다.

실제로 어떤식으로 사용하고 계신지 모르니,
그냥 짐작만 할뿐입니다..;

그리고, m_pVList 이면 m_pVList->at(0) 이런식이 되어야 하지 않을까 하는 생각도 들고요...;

아무튼 보여주신 예만으로는 알수가 없고, 앞뒤로 의심가는 부분을 좀 더 올려주셔야 도와드릴수 있을듯합니다.

일하는 사람들의 희망 민주노동당 : http://www.kdlp.org
반공 교육의 성과로, 민주주의의 반대가 공산주의(또는 사회주의)라고 생각하는 사람이 많다.

seagul2의 이미지

아...변수를 ^^;;
제가 글을 올릴때 잘못올렸군요...

아래가 테스트에 사용된 전체 소스입니다.
두번째 데이타 들어가면서 부터 에러가 발생합니다.
출력시에는 어떠한 문제도 생기지 않구요..

std::vector<int>m_pVList;

for(int i = 0; i < 2; i++)
   m_pVList.push_back(i);
lyster의 이미지

vector의 메모리 재할당 때문인 것 같네요. 이렇게 해보세요.

std::vector<int> m_pVList;

m_pVList.reserve(2); // 공간 확보

for(int i = 0; i < 2; i++)
   m_pVList.push_back(i);

게으름은 이제 그만

seagul2의 이미지

허걱 감사합니다...
메모리 재할당 문제였군요 ^^;;
즐건 하루 되세요~

쌀밥의 이미지

reserve 로 경고가 해결되었다면,
굳이 신경쓰지 않아도 되는 경고 일것 같습니다.

이건 다른 이야기입니다만
재 할당에서 오는 성능상의 오버 헤드를 줄일 수 있는 방법으로
vector 대신에 deque을 사용하는 방법이 있습니다.
C API와 호환해서 사용할 수 없다는 점만 빼면 일반적으로 성능이나 인터페이스 면에서 더 괜찮은 선택이 될 수 있습니다.
참고하세요...

일하는 사람들의 희망 민주노동당 : http://www.kdlp.org
반공 교육의 성과로, 민주주의의 반대가 공산주의(또는 사회주의)라고 생각하는 사람이 많다.

seagul2의 이미지

네 참고할께요~ :D

댓글 달기

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