繁体   English   中英

在Qt5中使用QSharedPointers时出现段故障

[英]Seg Fault when using QSharedPointers in qt5

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

我的旧代码如下:

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

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

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

谢谢你的时间!

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

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

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

最简单的解决方法是更新styleArch *的所有者,使其持有QSharedPointer <>来设置Arch的样式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM