簡體   English   中英

在Qt5中使用QSharedPointers時出現段故障

[英]Seg Fault when using QSharedPointers in qt5

我正在將qt5.5.1與qt-creator 3.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方法對您剛剛創建的臨時QSharedPointer進行const引用 ,並短暫使用它,但重要的是,不會遞增QSharedPointer的引用計數器(因為它是const)。

這意味着,一旦對setStyle的調用完成,臨時QSharedPointer就會超出范圍(調用其析構函數),並從堆中刪除styleArch對象。 這使您陷入困境,因為styleArch *的原始所有者不知道它現在持有無效的指針。 進一步使用styleArch *應該會出現段錯誤。

最簡單的解決方法是更新styleArch *的所有者,使其持有QSharedPointer <>來設置Arch的樣式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM