我将qt5.5.1与qt-creator 3.5.1结合使用,并试图在带有GeoDataPlacemark的GeoDataStyle上设置样式。它过去工作得很好,但是在使用共享指针而不是直接指针的大理石更新之后,我的程序会设置错误。使用GDB,我将seg故障跟踪到使用QSharedPointer直接指针创建styleArch的行。有谁知道会有什么问题吗?
我的旧代码如下:
styleArch->setIconStyle( *icon );
place->setStyle( styleArch ); //Old Marble使用新的大理石API的新代码如下:
styleArch->setIconStyle( *icon );
place->setStyle(Marble::GeoDataStyle::Ptr( styleArch )); //New Marble耽误您时间,实在对不起!
发布于 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<>来代替样式。
https://stackoverflow.com/questions/42208149
复制相似问题