2014-09-25 2 views
1

I 핵심에 다음과 같은 스택 추적이 있습니다Qt는 코어

#1 0x..... in raise() 
#2 0x..... in abort() 
#3 0x..... in xehInterpretSavedSigaction() 
#4 0x..... in xehExceptionHandler() 
#5 <signal handler called> 
#6 0x..... in QMap<int, myClass#1>::freeData(QMapData*)() 
#7 0x..... in myClass#2::myClass#2Method() 
#8 0x..... so on and so forth 

QMap를 사용하는 코드는 다음과 같습니다

 foreach (myClass::sturct1 conn, myClass3->getMap()) 
    { 
     if (conn == x) 
     { 
      return conn; 
     } 
    } 

foreach는 라인이다 여기서 QMap은 getter 메소드로 검색됩니다. 누구든지 QMap :: freeData()가하는 일을 알고 있습니까? 내가 인터넷에서 찾을 수있는 유일한 참조는 실제 QMap.h 소스입니다. 메서드가 QMap 소멸자에서 사용되는 것처럼 보입니다. 메소드 이름은 데이터를 자유롭게한다고 믿게합니다. 어쨌든 freeData()에 대해 더 많이 알고 있다면이 코어를 찾아서 고칠 수있을 것이라고 생각합니다.

답변

0

freeData에 대해 알 필요가 없습니다. myClass3 내의지도 필드 내용이 손상되어 getMap()은 손상된지도 인스턴스를 얕은 복사본에 복사합니다. freeData은 작동하는 객체가 잘못된 코드로 인해 손상되지 않은 한 제대로 작동합니다.

  1. 는 각 스레드에서 공유 데이터 구조의 별도의 인스턴스에서 작동 :

    가 여러 스레드에서 데이터에 액세스하려는 때문에, 당신은 중 하나를 수행해야합니다. 요점은 소스를 "소유"하는 스레드에 복사본을 만들어야한다는 것입니다. 그런 다음 사본을 다른 스레드로 전달하여 거기에 사용할 수 있습니다. 예제 코드는 this answer을 참조하십시오.

  2. 뮤텍스를 사용하여 데이터 구조에 대한 액세스를 보호하십시오.

+0

그래, 알았어. 여기서 아이디어는 모든 메소드의 끝 (또는 시작과 끝)에서 Map에 액세스 할 수 있습니까? 그런 식으로 제가 부패가 발생했던 곳에 도움이 될 다른 스택 추적으로 끝날 것입니까? .detatch()가 무슨 소용입니까? – Qman

+0

분명히 우리는 지난 한 해 동안이 문제를 여러 곳에서 해결해 왔습니다. 내가 이해하는 바와 같이, Map에는 명확하게 정의 된 소멸자가없는 C 구조가 포함되어 있으며이 경우의 얕은 사본이 문제입니다. 우리는이 문제를 두 가지 방법 중 하나로 해결합니다. 우리는지도의 로컬 (깊은) 복사본을 만들고 그 위에 반복합니다. 그것은 하나의 방법입니다. 다른 하나는 map.keys()를 반복하기 위해 foreach 루프를 변경하여 결코지도 자체의 얕은 복사본을 만들지 않는 것입니다. 그런 건 들어 본 적 있어요? – Qman

+0

그럼요? 그것은 C++ 클래스 내부에 정의 된 구조체입니다. sturct에는 2 개의 정수, 5 개의 정수 및 bool이 있습니다. 그게 전부 야. – Qman