C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[63298] Re:Re:EAccessViolation 문제
알론소 [smire4454] 1504 읽음    2010-12-20 17:54
답변감사합니다
저도 Map_LoopTCDV 이게 없는데 read를 하려니까
access violation 이 생기지않았나생각해서
소스다 보고그랬는데
보니까  Map_LoopTCDV를 erase()하는부분이있더라구요
그럼
Map_LoopTCDV가 map형식인데
그럼 erase()하게되면 저 iterator를 잃는걸로
알고있거든요 그러면

소스상에 for문으로
now = Map_LoopTCDV.begin(); now != Map_LoopTCDV.end(); ++now
를 조건으로 걸어서 돌리는부분이 아예 실행이 안되야하지않나요?????
제가 try catch 이거 해서 어디가 에러가 뜰까 한번봤는데
저기 for문 실행을 거치고
그안의 코드가 문제가되더라구요

erase()를 거치면 가르키는 곳을 잃어버리고
now = Map_LoopTCDV.begin(); now != Map_LoopTCDV.end(); ++now
이런걸 for문조건으로 걸면 이미 잃어버렸으니까 빈게되버려서 실행이
되면 안되는거고
now->second 이런것도 아예 실행조차 안되는거아닌가요?






땅주인 님이 쓰신 글 :
: 저도 이런 경험이 있어..제 경험을 적는데 도움이 될 런 지..
:
: AccessViolation문제는 Refreence하는 객체가 없거나 하는 문제인데..





: 저의 경우.. 문제되는 코드 부분이 아니라.(소스 코드와  상관없이.. )
: 다른 부분에서 포인터 운영을 잘못해서.. Referecen하는 객체의 메모리 영역에 다른 데이터를 써버려서.. ㅜ.ㅜ;;
: 해당 객체가 없어진 것이였습니다.
:
: 여기서는 Map_LoopTCDV 객체가 주요 범인일 공산이 큰데.
: 이놈이 있는 메모리 영역을 다른 소스코드에서 침범해서 뭘 써버렸다던가..하는 그런 경우를 예상해볼 수 있습니다.
:
: 사실, 이런 경우면 어디에서 이 영역을 침범했는 지 매우 애매한데.. 하여간.. 며칠을 눈 부라리고 찾았던
: 기억이 있네요. 결국 찾기는 찾았는데.. 삽질이 이런 거구나..뭐..그런 경험을..
:
: 암튼 성공하시기를..
:
: 알론소 님이 쓰신 글 :
: : 프로그램이 돌다가
: : 갑자기
: : 
: : read of access violation 오류 뜨면서 주소값뜨고
: :  경고창 뜨면서 그것도 수십개의 경고창이떠서
: : 프로그램이 멈춰버릴정도로 뜨거든요
: : 그래서 제가 이게 도대체 어느 함수에서 일어나는지 한번
: : 찍어봤거든요
: :
: : 소스는 아래구요
: :
: :     MAP_VDS_TCDV::iterator now;
: :
: :     try
: :     {
: :         for ( now = Map_LoopTCDV.begin(); now != Map_LoopTCDV.end(); ++now )
: :         {
: :                 if ( now->second.useyn && now->second.comm)
: :                 {
: :                     now->second.m_pObject                       = new CVdsObject(this);
: :                     memcpy(now->second.m_pObject->tcdv_info.tcdv_id ,now->second.tcdv_id, 10);
: :                     now->second.m_pObject->tcdv_info.TS_IP      = now->second.TS_IP;
: :                     now->second.m_pObject->tcdv_info.TS_Port    = now->second.TS_Port;
: :                     now->second.m_pObject->tcdv_info.m_Polling  = now->second.m_Polling;
: :                     now->second.m_pObject->tcdv_info.useyn      = now->second.useyn;
: :                     memcpy(now->second.m_pObject->tcdv_info.addr_id ,now->second.addr_id, 4);
: :                     now->second.m_pObject->Init();
: :
: :                     if ( now->second.m_pObject->Connect())
: :                         now->second.m_pObject->Resume();
: :                     else
: :                     {
: :                         delete now->second.m_pObject;
: :                         now->second.m_pObject = NULL;
: :                     }  // end of else
: :                 }  // end of if
: :         }  // end of for
: :     }
: :     catch( Exception &e )
: :     {
: :         AnsiString error;
: :         error.sprintf("ERRORmainTimerConnect : %s, %s",e.Message, );
: :         AddMsg(error.c_str());
: :     }
: :
: : 로그가 아래처럼
: : ERRORmainTimerConnect : EAccessViolation
: : 이렇게 로그가 남기는거 보니 저함수인거같더라구요.
: : 근데 이게 어디가문제인지모르겠어요
: : 
: : read를 할수 없다고하는거보니까 빈값이나 뭐 now가 없는상탠데 읽을려그러니까
: : 그러는거같은데
: : 만약에 now가 begin()이랑 end() 같다면 저 for문을 빠져나가서 문제없을꺼같구
: : 안같으니까 for 문을 도는데 도대체 어디가문젠지모르겠어요
: :
: : 이거 타이머가 시간이 딱되서 코드를 실행시키고있는데
: : 중간에 통신이 끊어져서 어디가 delete되거나 그래서그런건가요?
: : 막상 로그남긴거봤는데 어느줄에서문젠지
: : 어떻게해야할지모르겠어요.ㅠㅠ 저소스만보고선 파악못하나요

+ -

관련 글 리스트
63287 EAccessViolation 문제 알론소 3743 2010/12/17
63289     Re:EAccessViolation 문제 땅주인 2168 2010/12/17
63298         Re:Re:EAccessViolation 문제 알론소 1504 2010/12/20
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.