이것은 일종의 예외적 인 죽은 자물쇠인가요? 어떻게 피하는가?C++ Builder 2010 예외 데드락?
objlist에 저장된 연결된 클라이언트의 TIdContext 개체가있는 행을 아래에서 살펴보고 처리해야 할 때가 있습니다. 그러나 다른 스레드가 목록을 처리하는 동안 한 명의 사용자가 연결이 끊어진 경우 해제 된 TIdContext-> Data 개체에 대해 Access voilation을 얻습니다. 그래도 괜찮습니다. try/catch를 사용하지만 문제는 아래 줄에 몇 가지 종류가 있습니다. 죽은 자물쇠 및 프로세스가 멈추었습니다. 디버거를 부착하면 Access voilation을 다시 반복해서 표시하고, 그 예외적 인 dead lock 때문에 cpu coonsumption이 올라갑니다. 객체가 null가 아닌 경우
AnsiString UserID = ((Tmyobject*) ((TIdContext*) ObjList->Objects[i])->Data)->UserID;
은 내가, 내가 개체에 액세스하기 전에 확인할 수 있습니다 알고, 그것은 작동합니다 ..하지만 내 질문의 경우 한 번 파란 달의 데이터 객체가 NULL 때 지점에서 해제 될 것입니다 검사가 수행되고 다음 줄에 다시 객체에 액세스 할 때 동일한 죽은 자물쇠가 생깁니 까 ???
이렇게 죽은 잠금 예외를 피하고 처리하는 방법은 무엇입니까? 여기
는:005F07C0 System::AnsiStringBase::AnsiStringBase(this=:0285FCE0, src=????)
:0040223F System::AnsiStringT<0>::AnsiStringT<0>(this=:0285FCE0, src=:00000008)
:00457996 TSomeClass::SomeFunction(this=:009D8230, UserID={ }, DataSize={ },)
:0047BFF1 __linkproc__ ThreadProc(Thread=:009561C0)
:004AD00E __linkproc__ ThreadWrapper(Parameter=:009EAA30)
:7c80b729 ; C:\WINDOWS\system32\kernel32.dll
액세스 위반 처리하는 try/catch를 사용하지 마십시오
감사
C++ 빌더가 악합니다! 미안, 나는 단지 그것을 말해야만했다 :]. – pajton
BTW, try/catch는 액세스 위반이 아닌 C++ 예외를 잡기위한 것입니다. –