2017-02-13 42 views
0

我正在qt-creator 3.5.1中使用qt5.5.1,並試圖用GeoDataStyle設置GeoDataPlacemark上的樣式。它以前工作正常,但大理石更新後使用共享指針,而不是直接指針,我的程序段故障。使用GDB,我已經將seg fault追溯到我用styleArch直接指針創建QSharedPointer的那一行。有沒有人有一個想法可能是什麼問題?qt5中使用QSharedPointers時出現Seg錯誤

我的舊代碼如下:

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

新的代碼,它使用了新的大理石API如下:

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

感謝您的時間!

回答

1

該行:Marble::GeoDataStyle::Ptr(styleArch)創建一個臨時QSharedPointer並將其作爲指針傳遞給styleArch。 QSharedPointer在此時取得styleArch *的所有權,這意味着無論以前擁有的styleArch *不再擁有它。

setStyle方法採用const引用到您剛纔創建的臨時QSharedPointer並使用它短暫,但重要的是,不增加QSharedPointer的引用計數器(因爲它是常量)。

這意味着只要對setStyle的調用完成,臨時QSharedPointer就會超出範圍(調用它的析構函數)並從堆中刪除styleArch對象。這會給你帶來不好的結果,因爲styleArch *的原始擁有者不知道它現在持有無效指針。任何進一步使用styleArch *應該是段錯誤。

最簡單的修復方法是更新styleArch *的所有者,以保持QSharedPointer <>而不是樣式拱。

+0

嗨,感謝您的快速回復!您的評論指出了我的正確方向。我創建了一個類型爲QSharedPointer 的新變量,如下所示: 'styleArchSP = QSharedPointer (new GeoDataStyle); styleArchSP-> setIconStyle(* icon); place-> setStyle(styleArchSP);' –

+0

沒錯。通過將共享指針實例化爲styleArchSP,確保它的生命週期超出了調用setStyle的範圍。這是否解決您的seg故障問題? –

+0

是的,它的確如此。非常感謝你! –

相關問題