검색결과 리스트
액세스 위반에 해당되는 글 1건
글
첫째 예외가 있습니다. 0xC0000005: 0x00000018 위치를 읽는 동안 액세스 위반이 발생했습니다.
프로그래밍을 하다보면 가장 자주 만나는 에러 메시지 중의 하나이다..
첫째 예외가 있습니다. 0xC0000005: 0x00000018 위치를 읽는 동안 액세스 위반이 발생했습니다.
가장 흔히 하는 실수로는 아직 할당하지 않은 메모리에 접근하는 경우에 발생한다.
예를 들어 A 라는 class를 정의해 두고서 A의 포인터 객체를 생성한 후 메모리를 할당하지 않은 상태에서
포인터 객체의 멤버에 접근을 하는 경우에 발생하는 경우가 가장 흔하다.
A *a;
a ->멤버함수 or 멤버변수 사용 ;
...첫째 예외가 있습니다. 0xC0000005: 0x00000018 위치를 읽는 동안 액세스 위반이 발생했습니다.
a라는 포인터 객체를 생성했다면 new 연산자를 통해 메모리를 할당해 주어야 한다.
아래와 같은 패턴으로 사용하면 에러 메시지는 발생하지 않을 것이다.
A *a;
a = new A;
a ->멤버함수 or 멤버변수 사용 ;
delete a; //이 때 가장 중요한 메모리 해제는 잊으면 안된다.
그런데, 내가 이번에 경험한 경우는 Roboticslab이라는 시뮬레이션 프로그램을 짜다가 발생한 문제이다.
xdl 파일을 통해 control algorithm이 작성되어있는 dll을 하나의 응용프로그램에서 공유하면서 발생한 문제인 것으로 보여진다.
이유는 모르겠지만 ,TeachingSW라는 클래스의 포인터 객체를 생성하여 메모리를 할당한 후에 멤버 변수에 접근을 했음에도 위와 같은 엑세스 에러가 발생했다.
그래서 직접 해당 에러가 발생하는 변수만 memset을 통해 메모리를 설정해 주니 해당 에러가 없어지는 것아닌가..
정확한 원인은 파악하지 못했지만, 임시 방편으로 발견한 해결책이라도 기억해 두면 좋을 것 같다.
구현 예..
///////////////////////////////////
//// TeachingSW 관련 변수 초기화
if (StringComp(identifier, id_L) == 1){
T_HML = new TeachingSW_HM;
memset(&T_HML->home_q, 0, sizeof(T_HML->home_q)); //// 정말 이상한 점... home_q만 건들면 엑세스 에러가 발생해서 멤셋을 따로 해준다..
T_HML->home_q.resize(7); //// 정말 이상한 점인데... home_q만 건들면 엑세스 에러가 발생해서 멤셋을 따로 해준다..
T_HML->event_q.resize(7);
T_HML->cur_q.resize(7);
T_HML->des_q.resize(7);
}
else if (StringComp(identifier, id_R) == 1){
T_HMR = new TeachingSW_HM;
memset(&T_HMR->home_q, 0, sizeof(T_HMR->home_q)); //// 정말 이상한 점... home_q만 건들면 엑세스 에러가 발생해서 멤셋을 따로 해준다..
T_HMR->home_q.resize(7); //// 정말 이상한 점인데... home_q만 건들면 엑세스 에러가 발생해서 멤셋을 따로 해준다..
T_HMR->event_q.resize(7);
T_HMR->cur_q.resize(7);
T_HMR->des_q.resize(7);
}
'Skills > Programming' 카테고리의 다른 글
C++ 반전 연산자~와 논리 연산자 !의 차이 (0) | 2014.12.16 |
---|---|
공유 메모리를 이용한 IPC (0) | 2014.12.15 |
MFC dialog에서 콘솔(console)로 디버깅하기 (0) | 2014.12.15 |
[C/C++] double 형 데이터에 분수 넣기 (0) | 2014.12.09 |
클래스 객체 생성 방법에 관하여.. (new 사용에 관하여) (0) | 2014.11.12 |