首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QSharedPointers在qt5中应用时的故障

QSharedPointers在qt5中应用时的故障
EN

Stack Overflow用户
提问于 2017-02-13 15:52:33
回答 1查看 333关注 0票数 0

我将qt5.5.1与qt-creator 3.5.1结合使用,并试图在带有GeoDataPlacemark的GeoDataStyle上设置样式。它过去工作得很好,但是在使用共享指针而不是直接指针的大理石更新之后,我的程序会设置错误。使用GDB,我将seg故障跟踪到使用QSharedPointer直接指针创建styleArch的行。有谁知道会有什么问题吗?

我的旧代码如下:

代码语言:javascript
复制
styleArch->setIconStyle( *icon );
place->setStyle( styleArch ); //Old Marble

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

代码语言:javascript
复制
styleArch->setIconStyle( *icon );
place->setStyle(Marble::GeoDataStyle::Ptr( styleArch )); //New Marble

耽误您时间,实在对不起!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-13 22:38:14

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

setStyle方法接受对您刚才创建的临时QSharedPointer的const引用,并简要使用它,但重要的是,它不会增加QSharedPointer的引用计数器(因为它是const)。

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

最简单的修复方法是更新styleArch*的所有者,使其拥有一个QSharedPointer<>来代替样式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42208149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档