2017-02-13 43 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

是的,它的确如此。非常感谢你! –

相关问题