问题标签 [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 投票
1 回答
604 浏览

c++ - QSharedPointer 没有线程安全开销?

我需要使用 aQSharedPointer进行引用计数,但我将在单线程应用程序中使用它,所以我不想要线程安全开销(我认为它相当昂贵)。

有没有办法关闭线程安全,或者是否有一个仅提供引用计数的等效 Qt 类?如果没有,是否有不需要我包含像 boost 之类的大库或打开 c++11 的独立类?

0 投票
2 回答
437 浏览

c++ - 调用 qsharedpointer 的 data() 时引用的数量是否会改变

如果我写这段代码:

指向整数的引用数为 1。
但是当我像这样调用 data() 时:

引用数是 1 还是 2?
感谢帮助。

0 投票
1 回答
933 浏览

c++ - 如何删除 QSharedPointer

我已经围绕 QTextEdit 编写了一个包装器,以便像 QIODevice 一样使用它。我希望能够使用具有相同 QTextEdit 的多个包装器,因此我可以对每个包装器使用不同的文本颜色。

为了使这个包装器线程安全,我添加了一个 QMutex 来保护 QTextEdit 的使用。但我在想我必须只使用一个互斥锁来保护一个 QTextEdit。

我最终得到以下实现,使用 QSharedPointer 来保护 QTextEdit。

文本编辑设备.h

文本编辑设备.cpp

我想知道在哪里可以从mutexes映射中删除 QSharedPointer 实例,以便删除 QMutex。

谢谢你的帮助

0 投票
0 回答
167 浏览

c++ - 从 QSharedPointer 写入二进制数据给出意外的文件大小

我目前的问题本质上是我似乎无法写入我想要磁盘的所有数据。

我要做的是以二进制格式将浮点值一个接一个地保存到磁盘。在 1.000.000 和 400.000.000 个浮点值之间可以有任何偶数个值。在内部,数据存储在 QSharedPointer 中。我在不同的函数、不同的线程中使用相同的数据。我确保访问不会更改字段中的值。

我所拥有的类似于:

例如,如果我在数据中有 4.000.000 浮点值,我会按预期得到所有内容:要写入 4.000.000 个元素,每个元素 4 个字节,总共要写入 16.000.000 个字节。但我发现写入的实际数量是:15.990.784 字节。

如果我尝试在数据中总共使用 2.000.000 个元素,则写入的字节数为:7.995.392 而不是 8.000.000。这是一致且可重复的。丢失的字节数量与我在数据中的条目数量成正比。

有趣的事实:我在另一个线程中有另一个函数,它使用相同的 QSharedPointer 来执行此操作:

如果我在数据中有 4.000.000 个条目,则 vec1 和 vec2 中的元素数量为 2.000.000。

那么我在第一个函数中做错了什么?为什么写入文件的字节数错误?

编辑:// 这应该开始整个事情:

0 投票
1 回答
944 浏览

c++ - this 指针和 QSharedPointer

我有一个类似树节点的类Message,它看起来像这样:

这个类可以有一个父级和一组子级。我在实现addChildandsetParent成员函数时遇到了问题:

我期望会发生什么:

  1. Message::addChild被调用
  2. thisPtr使用引用计数 1 创建
  3. childPtr->parent() != thisPtr将解决true
  4. childPtr->setParent(thisPtr);,Message::setParent被执行并且thisPtr引用计数将随着共享指针的副本被创建而增加 1。现在thisPtr的引用计数为 2
  5. 随着Message::setParent执行,m_parentPtr = parentPtr;将增加m_parentPtrparentPtr因此thisPtr引用计数增加 1;这 3 个智能指针现在的引用计数为 3。
  6. 执行退出Message::setParent并销毁将和parentPtr的引用计数减1m_parentPtrthisPtr
  7. 执行返回Message::addChild。现在的引用计数thisPtr为 2。

实际发生的情况:

当执行退出时,引用计数中的if语句Message::addChild thisPtr再次减少 1,留下thisPtr的引用计数为 1。这使得一切都在执行存在时中断Message::addChildthisPtr被破坏,因此this被删除。

我的问题:

为什么当执行退出语句或那里实际发生的情况thisPtr时引用计数再次减少?...ifMessage::addChild

以下是它在调试器中的运行方式: 在此处输入图像描述

0 投票
0 回答
818 浏览

qt4 - QSharedPointer 的参考计数

std::shared_ptr 有一个 use_count 函数的方式,它返回引用同一托管对象的 shared_ptr 对象的数量;以同样的方式,我们如何获得 QSharedPointer 的引用计数。我没有找到任何API。这怎么能实现?

0 投票
2 回答
1225 浏览

c++ - QSharedPointer 或 std::shared_ptr 的生命周期

在我的应用程序中

我有一个MainWindow(这是一个QtMainWindow类)和一个Acquisiton类(这是一个QThread类)

这是我非常简化的 Acquisiton 课程

在我的 MainWindow 中

我不明白 QSharedPointer 的生命周期(和 std::shared_ptr (想象与 std::shared_ptr 相同的代码)

我的 QSharedPointer 是否始终有效?如果在处理期间(MainWindow),发生 usb_read() 并且 memcpy 写入我的图像,则附加什么。

在一个相关的问题中:在退出前等待槽执行

如果采集线程在数据处理期间停止,我看到 QSharedPointer 使我的数据保持有效。

在这种情况下,是我的信号被取消,我的值被复制到某处还是线程等待我的 MainWindow 完成处理?

谢谢

0 投票
1 回答
295 浏览

c++ - 在 qt5 中使用 QSharedPointers 时出现段错误

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

我的旧代码如下:

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

谢谢你的时间!

0 投票
0 回答
607 浏览

c++ - 保存 QList> 作为 QVariant

我在派生的 QGraphicsItem 类中将 QSharedPointer< MyClass > 的 QList 保存为 QVariant 时遇到问题。MyClass 是用作接口的抽象基类。我这样做是为了能够将所有“MyClass 子类”向上转换为基础 MyClass 并将它们全部放入一个容器(列表、地图等)中。

控制台输出:

kernel\qvariant.cpp(2150): QVariant::save: 无法保存类型 <'QList < QSharedPointer< MyClass> >' (类型 id: 1035)。

global\qglobal.cpp(3052):QVariant::save 中的 ASSERT 失败:“要保存的类型无效”,文件 kernel\qvariant.cpp,第 2151 行

代码摘要:

这工作正常,但是当我将 newCustomItem 添加到 QGraphicsScene 并单击它时,会发生上述错误。似乎必须为 QSharedPointer< MyClass > 实现流运算符(QDataStream &operator<< 和 QDataStream &operator>>)。但这有可能吗?这有意义吗?

0 投票
1 回答
289 浏览

c++ - 将 QNetworkReply 指针传递给 QSharedPointer

关于QSharedPointer在以下场景中使用的一个问题:

我有一个有两个QSharedPointers 私人班级成员的班级:

在我发送QNetworkAccessManager帖子的代码中,返回值是一个QNetworkReply指针。

我想将此指针传递给我的QSharedPointerie m_nr。我试过了:

但是崩溃了,然后我尝试了:

但也崩溃了。

如何将QNetworkReply指针正确传递给我的QSharedPointer