在qt5中使用QSharedPointers时出现Seg Fault

时间:2017-02-13 15:52:34

标签: c++ qt qt5 qsharedpointer marble

我正在使用qt5.5.1与qt-creator 3.5.1并尝试使用GeoDataStyle在GeoDataPlacemark上设置样式。它曾经工作正常,但在Marble更新后使用共享指针而不是直接指针,我的程序seg故障。使用GDB,我已经将seg故障跟踪到我使用styleArch直接指针创建QSharedPointer的行。有没有人知道可能是什么问题?

我的旧代码如下:

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

使用新Marble API的新代码如下:

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

谢谢你的时间!

1 个答案:

答案 0 :(得分:1)

行:Marble::GeoDataStyle::Ptr( styleArch )创建一个临时QSharedPointer并将styleArch作为指针传递给它。此时QSharedPointer取得了styleArch *的所有权,这意味着以前拥有的styleArch *不再拥有它。

setStyle方法将 const引用带到刚创建的临时QSharedPointer并简单地使用它,但重要的是,不会增加QSharedPointer的引用计数器(因为它是const)。

这意味着只要对setStyle的调用完成,临时QSharedPointer就会超出范围(调用其析构函数)并从堆中删除styleArch对象。这会让你感觉很糟糕,因为styleArch *的原始所有者不知道它现在持有无效指针。任何进一步使用styleArch *都应该是段错误。

最简单的解决方法是更新styleArch *的所有者以保存QSharedPointer<>改为改造拱门。