问题标签 [qsharedpointer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1520 浏览

c++ - 为什么在 QSharedPointer 中使用窗口时会出现分段错误?

我正在使用 Qt 4.7.4(64 位)开发一个 gui proram。我试图将问题隔离如下:

我有一个窗口:class PreferencesWindow : public QMainWindow在另一个类中我初始化并将其显示为

一切都很好,然后我通过按下ESC或单击x窗口上的按钮来关闭窗口。然后我打电话

终止整个程序。它终止,但在终止之前给出了分段错误。

这里的问题是为什么当我使用常规指针而不是它时它会干净地终止, 以及在这种情况下QSharedPointer如何QSharedPointer正确使用?

0 投票
1 回答
16137 浏览

c++ - QSharedPointer,如何传递它们,我需要它们吗?

几天来一直试图理解共享指针,感觉好像我无法理解它。不知道是不是太明显了还是太复杂了。首先,谁能给我一个实际使用共享指针的例子。维基百科上的例子对我来说毫无意义。以及如何将共享指针传递给另一个函数或使用共享指针创建对象。那么,你如何传递它以及你会在哪里使用它?任何信息或示例都会很棒。

另外,我有这个问题,我不知道该使用什么。我有这个函数,我在其中分配 aQFile并将其传递给另一个类中的函数。该函数将文件作为 a QIODevice*,然后创建一个包含该文件的对象。我想知道这里最好的解决方案是什么,以及如何(如果我应该)在这里使用共享指针?如何创建共享指针<QFile>并将其传递到函数需要的位置<QIODevice>。感觉我根本没有得到共享指针......

我的另一种方法是将分配QFileQScopedPointer. 然后我将它传递给类,在创建将存储文件的对象时,我使用QPointeror QScopedPointer。在第一个调用函数结束时,我应该调用 take() 对吗?

因此,如果“new”抛出异常,我想要一种存储指针的方法和一种在创建过程中处理它们的方法。

0 投票
1 回答
1222 浏览

c++ - 泛化共享指针和 QSharedPointer::data() vs shared_ptr::get()?

我制作了一个基于长期抽象的 Qt 库QSharedDataPointer,例如和QSharedData. 因此,当我需要一个普通的共享指针时,QSharedPointer为了保持一致性,使用它是有意义的。

我现在在 C++11 项目中使用它。为了使代码更标准,我将切换到shared_ptr它的所有本地子系统。

库本身中的 C++11 依赖项不一定是可取的,因此感觉您应该能够选择要使用的共享指针类型。作为向前迈进的第一步,我尝试了 C++0x 中模板别名的灵活性中建议的这种方法(诚然是 C++11 依赖项本身,但我可以通过非 C++11 中的编译器标志使用预处理器构建)

不幸的是,指针类为方法选择了不同的名称。值得注意的是,访问包含的指针是由.get()shared_ptr 和.data()QSharedPointer 完成的。

我打算做一个提取器,某种shared_ptr_type_get<>但后来注意到一个可以有效地实现同样的事情(在包含的指针不为空的情况下,我可以通过布尔强制测试空):

如果您正在阅读代码,这是一个有点减速带的东西,并且有人可能会尝试优化(然后很快就会发现这是行不通的)。但除了WTF因素之外,它似乎无害……是吗?

0 投票
1 回答
304 浏览

c++ - Qt 智能指针等效于 boost::shared_array?

虽然存在boost::shared_ptr( QSharedPointer) 的等价物,但我无法找到类似的东西boost::shared_array

当然我可以使用类似的东西

但我想知道是否存在提供T& operator[](size_t)使用delete[]而不是delete. 我不愿意在这个项目中使用 boost,因为目标机器无法安装 boost,并且项目是按源分发的。

注意:我知道我可以使用 指定删除器QSharedPointer::QSharedPointer ( T * ptr, Deleter deleter ),但是我不喜欢这种方法,因为编译器不会强制您指定删除器,这会导致new []分配的块被delete.

0 投票
2 回答
6019 浏览

c++ - QSharedPointer 和 QObject::deleteLater

我有一种情况,一个QSharedPointer托管对象表示它已经完成了它的目的并准备好很快删除(在执行后离开函数发出我的readyForDeletion信号)。使用普通指针时,我只调用对象,但是使用-managed 实例QObject::deleteLater是不可能的。QSharedPointer我的解决方法如下:

这很好用,但是使用这种方法有很多开销(分配一个新的QObject等等)。有没有更好的解决方案来处理这种情况?

0 投票
2 回答
6427 浏览

c++ - 设置 QSharedPointer

我来自 C# 背景,仍然对 C++ 和 Qt 智能指针有所了解。这应该是一个基本问题:

在 myClass.h

在 myClass.cpp 我试图设置(设置正确的词?) m_flags 指针

编译器抱怨“与'operator ='不匹配..如何设置指针?

0 投票
3 回答
1199 浏览

c++ - 检查两个 QSharedPointer 是否有相等的数据

我有两个 QSharedPointer,我可以像这样使用operator==检查它们是否指向同一个对象

或者我必须写

存储在指针中的对象具有重载的 operator==。

0 投票
2 回答
1894 浏览

c++ - Pimpl + QSharedPointer - 析构函数 = 灾难

昨天我遇到了痛苦,这让我沮丧了 24 小时。问题归结为随机发生的意外崩溃。更复杂的是,调试报告也有绝对随机的模式。更复杂的是,所有调试跟踪都导致随机Qt 源或本地 DLL,即每次都证明问题不在我这边。

这里有一些这样可爱的报告的例子:



正如您所看到的,这些东西非常讨厌,它没有提供任何有用的信息。但是,有一件事我没有注意。这是编译期间的一个奇怪的警告,也很难用眼睛捕捉到:

实际上,我只是将这个警告作为最后的手段,因为在如此绝望地寻找错误的过程中,代码已经感染了字面上的日志死亡。

仔细阅读后,我想起了,例如,如果使用std::unique_ptrstd::scoped_ptr用于Pimpl - 肯定应该提供析构函数,否则代码甚至无法编译。但是,我还记得它std::shared_ptr不关心析构函数并且没有它也可以正常工作。这也是我没有注意这个奇怪警告的另一个原因。长话短说,当我添加析构函数时,这种随机崩溃停止了。看起来 QtQSharedPointerstd::shared_ptr. 我想如果 Qt 开发人员将此警告转化为错误会更好,因为这样的调试马拉松根本不值得花时间、精力和精力

我的问题是:

  1. 有什么问题QSharedPointer?为什么析构函数如此重要?
  2. 为什么在没有析构函数的情况下会发生崩溃?这些对象(使用Pimpl + QSharedPointer)是在堆栈上创建的,并且在它们死后没有其他对象可以访问它们。然而,坠机发生在他们死​​后的某个随机时间段内。
  3. 有没有人遇到过这样的问题?请分享你的经验。
  4. Qt 中是否还有其他类似的陷阱——我必须知道这些陷阱以确保将来保持安全?

希望这些问题和我的一般帖子能帮助其他人避免我过去 24 小时去过的地狱。

0 投票
1 回答
661 浏览

qt - QSharedPointer dynamicCast 和 objectCast 在 ubuntu 上失败

我在 Ubuntu 10.04 下使用 Qt 5.0.1,在我的应用程序中,我需要在运行时将 QSharedPointer 与适当的 dynamic_cast (object_cast) 转换一起使用。这些转换在运行时正确加载的共享对象中调用。我必须部署我的应用程序才能在具有 Ubuntu 10.04 操作系统的嵌入式计算机上运行它;这就是我在 Ubuntu 10.04 下使用 Qt 的原因。

如果我构建我的应用程序并在安装了 Qt 库的同一台机器上运行它,那么一切都会按预期工作。

但是,如果我在嵌入式计算机上运行应用程序,qSharedPointerDynamicCast(以及类似的 QSharedPointer::dynamicCast、qSharedPointerObjectCast 和 QSharedPointer::objectCast)会失败并返回空指针。我检查了两台机器是否具有相同的配置,并且除了 dynamic_cast/object_cast 问题之外,一切似乎都运行良好。

我认为这可能是一个 RTTI 问题,但是,经过广泛的谷歌搜索,我没有找到我的问题的解决方案。

0 投票
0 回答
352 浏览

qt - Qt 的安全共享指针

由于Qt使用其可怕的古老 ptr 机制,因此使用它们QSharedPointer大多是不切实际的。在插槽QSharedPointer中设置 a的那一刻很可能会导致未定义的行为(崩溃)。此外,与相比, 的设计确实有错误的设计决策。所以我想到了一个合适的共享指针,它也可以在插槽中使用。nullptrQSharedPointerstd::shared_ptr

我想出的是以下内容:

虽然这似乎很有效,但我想知道是否还有其他陷阱,我没有考虑过。也将不胜感激有关这种方法的评论。