2017-02-13 1 views
0

Qt Creator 3.5.1에서 qt5.5.1을 사용 중이며 GeoDataStyle을 사용하여 GeoDataPlacemark에 스타일을 설정하려고합니다. 그것은 잘 작동하는 데 사용하지만 대리 포인터를 직접 포인터 대신 공유 포인터를 사용하여 업데이트 후 내 프로그램 seg faults. GDB를 사용하여 segault를 styleArch 직접 포인터로 QSharedPointer를 만드는 라인으로 추적했습니다. 누구든지 문제가 될 수있는 아이디어가 있습니까? 다음과 같이 새로운 대리석 API를 사용Qt5에서 QSharedPointers를 사용할 때 Seg 오류가 발생했습니다.

styleArch->setIconStyle(*icon); 
place->setStyle(styleArch); //Old Marble 

새로운 코드는 다음과 같습니다 : 시간에 대한

styleArch->setIconStyle(*icon); 
place->setStyle(Marble::GeoDataStyle::Ptr(styleArch)); //New Marble 

감사를 다음과 같이

내 예전의 코드이었다!

답변

1

줄 : Marble::GeoDataStyle::Ptr(styleArch)은 임시 QSharedPointer를 만들고이를 styleArch를 포인터로 전달합니다. QSharedPointer는이 시점에서 styleArch *의 소유권을 취합니다. 이전에 소유하고 있던 styleArch *가 더 이상 가지고 있지 않다는 것을 의미합니다.

setStyle 방법은 방금 만든 임시 QSharedPointer에 const를 참조을 취하며 잠시 사용하지만 (이 CONST 때문에) 중요한 것은, QSharedPointer의 참조 카운터를 증가하지 않습니다.

즉, setStyle 호출이 완료 되 자마자 임시 QSharedPointer가 범위를 벗어나 (소멸자를 호출 함) 힙에서 styleArch 객체를 삭제한다는 의미입니다. styleArch *의 원래 소유자가 현재 유효하지 않은 포인터를 가지고 있다는 것을 모르기 때문에 이것은 나쁜 방식으로 남아 있습니다. styleArch *를 더 이상 사용하면 segfault가 발생합니다.

가장 쉬운 수정은 QSharedPointer <> 스타일 아치 대신 styleArch *의 소유자를 업데이트하는 것입니다.

+0

안녕하세요, 빠른 답장을 보내 주셔서 감사합니다. 귀하의 의견은 올바른 방향으로 나를 지적했습니다. 다음과 같이 QSharedPointer 유형의 새 변수를 만들었습니다. 'styleArchSP = QSharedPointer (new GeoDataStyle); styleArchSP-> setIconStyle (* icon); place-> setStyle (styleArchSP); ' –

+0

정확합니다. sharedArray를 styleArchSP로 인스턴스화하면 setStyle 호출 이후의 수명을 연장 할 수 있습니다. 이 문제로 segault 문제가 해결 되었습니까? –

+0

예, 그랬습니다. 고마워요! –

관련 문제