【问题标题】:Seg Fault when using QSharedPointers in qt5在 qt5 中使用 QSharedPointers 时出现段错误
【发布时间】:2017-07-01 16:19:28
【问题描述】:

我将 qt5.5.1 与 qt-creator 3.5.1 一起使用,并尝试使用 GeoDataStyle 在 GeoDataPlacemark 上设置样式。它曾经工作正常,但在 Marble 更新后使用共享指针而不是直接指针,我的程序段错误。使用 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

感谢您的宝贵时间!

【问题讨论】:

    标签: c++ qt qt5 qsharedpointer marble


    【解决方案1】:

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

    setStyle 方法将 const 引用 用于您刚刚创建的临时 QSharedPointer 并短暂使用它,但重要的是,不会增加 QSharedPointer 的引用计数器(因为它是 const)。 p>

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

    最简单的解决方法是更新 styleArch* 的所有者,以持有 QSharedPointer 来代替 arch 的样式。

    【讨论】:

    • 您好,感谢您的快速回复!您的评论为我指明了正确的方向。我创建了一个 QSharedPointer 类型的新变量,如下所示:styleArchSP = QSharedPointer<GeoDataStyle>(new GeoDataStyle); styleArchSP->setIconStyle( *icon ); place->setStyle( styleArchSP );
    • 没错。通过将 sharedpointer 实例化为 styleArchSP,您可以确保其生命周期超出对 setStyle 的调用。这解决了您的段错误问题吗?
    • 是的,确实如此。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多