|
저도 이런 경험이 있어..제 경험을 적는데 도움이 될 런 지..
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되거나 그래서그런건가요?
: 막상 로그남긴거봤는데 어느줄에서문젠지
: 어떻게해야할지모르겠어요.ㅠㅠ 저소스만보고선 파악못하나요
|