문제

다음과 같이 보이는 코드가 있습니다.

TAxis *axis = 0;
if (dynamic_cast<MonitorObjectH1C*>(obj))
   axis = (dynamic_cast<MonitorObjectH1C*>(obj))->GetXaxis();

때로는 충돌이 발생합니다.

Thread 1 (Thread -1208658240 (LWP 11400)):
#0  0x0019e7a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
#1  0x048c67fb in __waitpid_nocancel () from /lib/tls/libc.so.6
#2  0x04870649 in do_system () from /lib/tls/libc.so.6
#3  0x048709c1 in system () from /lib/tls/libc.so.6
#4  0x001848bd in system () from /lib/tls/libpthread.so.0
#5  0x0117a5bb in TUnixSystem::Exec () from /opt/root/lib/libCore.so.5.21
#6  0x01180045 in TUnixSystem::StackTrace () from /opt/root/lib/libCore.so.5.21
#7  0x0117cc8a in TUnixSystem::DispatchSignals ()
   from /opt/root/lib/libCore.so.5.21
#8  0x0117cd18 in SigHandler () from /opt/root/lib/libCore.so.5.21
#9  0x0117bf5d in sighandler () from /opt/root/lib/libCore.so.5.21
#10 <signal handler called>
#11 0x0533ddf4 in __dynamic_cast () from /usr/lib/libstdc++.so.6

나는 그것이 왜 추락하는지 단서가 없습니다. obj 널이 아니에요 (그리고 그것이 문제가되지 않으면 문제가되지 않습니까?).

다이나믹 캐스트가 충돌하는 이유는 무엇입니까?

캐스트 할 수 없다면 Null No를 반환해야합니까?

도움이 되었습니까?

해결책

충돌에 대한 몇 가지 가능한 이유 :

  • obj 비 폴리 흉부 유형 (가상 방법이없는 클래스 또는 구조물 또는 기본 유형)을 가진 물체를 가리 킵니다.
  • obj 해방 된 물체를 가리 킵니다.
  • obj 액세스 할 때 예외 (예 : 가드 페이지 또는 액세스 할 수없는 페이지)를 생성하는 방식으로 매핑 된 메모리 또는 메모리를 가리 킵니다.
  • obj 다형성 유형의 물체를 가리키지 만 해당 유형은 RTTI 비활성화로 컴파일 된 외부 라이브러리에서 정의되었습니다.

이러한 모든 문제가 반드시 모든 상황에서 충돌을 일으키는 것은 아닙니다.

다른 팁

이 코드 스 니펫에 다른 구문을 사용하는 것이 좋습니다.

if (MonitorObjectH1C* monitorObject = dynamic_cast<MonitorObjectH1C*>(obj))
{
    axis = monitorObject->GetXaxis();
}

다른 스레드가 MoniterObject가 포인트를 삭제하거나 OBJ가 미친 쓰레기인지 삭제하는 경우에도 여전히 충돌 할 수 있지만 최소한 문제는 더 이상 관련되지 않으며 Dynamic_cast를 두 번 수행하지 않습니다.

때때로 충돌하기 때문에 스레딩 문제라고 확신합니다. 'obj'에 대한 모든 참조를 확인하십시오.

grep -R 'obj.*=' .

캐스트가 실패하고 포인터로 캐스팅되는 경우 Dynamic_cast는 0을 반환합니다. 문제는 코드의 초기에 힙을 손상 시켰거나 RTTI가 활성화되지 않았다는 것입니다.

'obj'의 값이 올바르게 정의되었다고 확신하십니까?

예를 들어, 그것이 시작되지 않은 경우 (즉, 무작위로) 충돌을 일으키는 것을 볼 수 있습니다.

OBJ의 값을 다른 스레드로 변경할 수 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top