在 qt5 中使用 QSharedPointer 时出现 Seg 错误
Seg Fault when using QSharedPointers in qt5
我正在使用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。
相关文章:
- C++ - 将元素按升序插入数组的 SEG 错误
- 为什么我在使用 istream 迭代器时会出现 seg 错误?
- 字符串上的合并排序上的 Seg 错误
- 导致 Seg 错误的 SingleLinkedList 的析构函数
- g++ 9.2.1 (Linux) 会导致 seg 错误,但 Windows 上的代码块不会
- 函数抛出seg错误,我不知道为什么
- Microsoft Visual Studio 2019交叉编译CMake库 - 有效,但存在SEG错误
- 由于相同的文件名/类名存在于不同的SO中而导致的SEG错误
- 尝试访问 3D 矢量中的元素时出现 Seg 错误
- 垫子对象数组太大会导致 Seg 错误
- 为什么push_back成矢量<矢量<int>>导致 seg 错误?
- 在向量中存储字符串存在 SEG 错误
- 更改本地类名时出现 seg 错误
- 使用 ->GetString( " ") 时出现 Seg 错误,它位于单独的类中
- 将字符数组转换为 std::string 以传递到 std::bitset seg 错误
- 字符和 int 连接何时会导致 seg 错误?
- 静态数组溢出堆栈(seg 错误 11)仅在类定义内部时,否则不会..?
- .EOF 在读取文件时导致 Seg 错误:FIXXED
- 在 qt5 中使用 QSharedPointer 时出现 Seg 错误
- 为什么我的 if 语句会出现 seg 错误?