qt-creator 3.5.1과 함께 qt5.5.1을 사용하고 있으며 GeoDataStyle로 GeoDataPlacemark에 스타일을 설정하려고합니다. 이전에는 잘 작동했지만 Marble 업데이트 후 직접 포인터 대신 공유 포인터를 사용하면 내 프로그램이 오류를 발생시킵니다. GDB를 사용하여 styleArch 직접 포인터를 사용하여 QSharedPointer를 만드는 줄까지 세그 오류를 추적했습니다. 누구든지 무엇이 문제가 될 수 있는지 알고 있습니까?
내 이전 코드는 다음과 같습니다.
styleArch->setIconStyle( *icon );
place->setStyle( styleArch ); //Old Marble
새 Marble API를 사용하는 새 코드는 다음과 같습니다.
styleArch->setIconStyle( *icon );
place->setStyle(Marble::GeoDataStyle::Ptr( styleArch )); //New Marble
시간 내 줘서 고마워!
줄 : Marble::GeoDataStyle::Ptr( styleArch )
임시 QSharedPointer를 만들고이를 포인터로 styleArch로 전달합니다. QSharedPointer는이 시점에서 styleArch *의 소유권을 가지므로 이전에 소유 한 styleArch *는 더 이상 소유하지 않습니다.
의 setStyle의 방법은 소요 const를 참조 방금 만든 임시 QSharedPointer을하고 그것을 잠시 사용하지만 (이 CONST 때문에) 중요한 것은, QSharedPointer의 참조 카운터를 증가하지 않습니다.
즉, setStyle에 대한 호출이 완료 되 자마자 임시 QSharedPointer가 범위를 벗어나 (소멸자를 호출) 힙에서 styleArch 객체를 삭제합니다. 이것은 styleArch *의 원래 소유자가 현재 잘못된 포인터를 보유하고 있다는 것을 전혀 모르기 때문에 당신을 나쁜 방식으로 만듭니다. styleArch *의 추가 사용은 segfault가되어야합니다.
가장 쉬운 수정은 styleArch *의 소유자를 업데이트하여 대신 QSharedPointer <>를 스타일 아치로 유지하는 것입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다