在 qt5 中使用 QSharedPointer 时出现 Seg 错误

Seg Fault when using QSharedPointers in qt5

本文关键字:Seg 错误 QSharedPointer qt5      更新时间:2023-10-16

我正在使用qt5.5.1和qt-creator 3.5.1,并尝试使用GeoDataStyle在GeoDataPlacemark上设置样式。它曾经工作正常,但是在 Marble 更新使用共享指针而不是直接指针之后,我的程序 seg 出错了。使用 GDB,我将 seg 错误追溯到我使用 styleArch 直接指针创建 QSharedPointer 的行。有谁知道可能是什么问题?

我的旧代码如下:

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

使用新大理石 API 的新代码如下所示:

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

谢谢你的时间!

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

setStyle 方法采用对您刚刚创建的临时 QSharedPointer 的 const 引用并短暂使用它,但重要的是,它不会递增 QSharedPointer 的引用计数器(因为它是 const(。

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

最简单的解决方法是更新 styleArch* 的所有者以持有 QSharedPointer<>改为样式 arch。