问题标签 [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.
c++ - QSharedPointer 没有线程安全开销?
我需要使用 aQSharedPointer
进行引用计数,但我将在单线程应用程序中使用它,所以我不想要线程安全开销(我认为它相当昂贵)。
有没有办法关闭线程安全,或者是否有一个仅提供引用计数的等效 Qt 类?如果没有,是否有不需要我包含像 boost 之类的大库或打开 c++11 的独立类?
c++ - 调用 qsharedpointer 的 data() 时引用的数量是否会改变
如果我写这段代码:
指向整数的引用数为 1。
但是当我像这样调用 data() 时:
引用数是 1 还是 2?
感谢帮助。
c++ - 如何删除 QSharedPointer
我已经围绕 QTextEdit 编写了一个包装器,以便像 QIODevice 一样使用它。我希望能够使用具有相同 QTextEdit 的多个包装器,因此我可以对每个包装器使用不同的文本颜色。
为了使这个包装器线程安全,我添加了一个 QMutex 来保护 QTextEdit 的使用。但我在想我必须只使用一个互斥锁来保护一个 QTextEdit。
我最终得到以下实现,使用 QSharedPointer 来保护 QTextEdit。
文本编辑设备.h
文本编辑设备.cpp
我想知道在哪里可以从mutexes
映射中删除 QSharedPointer 实例,以便删除 QMutex。
谢谢你的帮助
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。
那么我在第一个函数中做错了什么?为什么写入文件的字节数错误?
编辑:// 这应该开始整个事情:
c++ - this 指针和 QSharedPointer
我有一个类似树节点的类Message
,它看起来像这样:
这个类可以有一个父级和一组子级。我在实现addChild
andsetParent
成员函数时遇到了问题:
我期望会发生什么:
Message::addChild
被调用thisPtr
使用引用计数 1 创建childPtr->parent() != thisPtr
将解决true
childPtr->setParent(thisPtr);
,Message::setParent
被执行并且thisPtr
引用计数将随着共享指针的副本被创建而增加 1。现在thisPtr
的引用计数为 2- 随着
Message::setParent
执行,m_parentPtr = parentPtr;
将增加m_parentPtr
,parentPtr
因此thisPtr
引用计数增加 1;这 3 个智能指针现在的引用计数为 3。 - 执行退出
Message::setParent
并销毁将和parentPtr
的引用计数减1m_parentPtr
thisPtr
- 执行返回
Message::addChild
。现在的引用计数thisPtr
为 2。
实际发生的情况:
当执行退出时,引用计数中的if
语句Message::addChild
thisPtr
再次减少 1,留下thisPtr
的引用计数为 1。这使得一切都在执行存在时中断Message::addChild
,thisPtr
被破坏,因此this
被删除。
我的问题:
为什么当执行退出语句或那里实际发生的情况thisPtr
时引用计数再次减少?...if
Message::addChild
qt4 - QSharedPointer 的参考计数
std::shared_ptr 有一个 use_count 函数的方式,它返回引用同一托管对象的 shared_ptr 对象的数量;以同样的方式,我们如何获得 QSharedPointer 的引用计数。我没有找到任何API。这怎么能实现?
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 完成处理?
谢谢
c++ - 在 qt5 中使用 QSharedPointers 时出现段错误
我将 qt5.5.1 与 qt-creator 3.5.1 一起使用,并尝试使用 GeoDataStyle 在 GeoDataPlacemark 上设置样式。它曾经工作正常,但在 Marble 更新后使用共享指针而不是直接指针,我的程序段错误。使用 GDB,我将 seg 错误跟踪到我使用 styleArch 直接指针创建 QSharedPointer 的行。有谁知道可能是什么问题?
我的旧代码如下:
使用新 Marble API 的新代码如下:
谢谢你的时间!
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>>)。但这有可能吗?这有意义吗?
c++ - 将 QNetworkReply 指针传递给 QSharedPointer
关于QSharedPointer
在以下场景中使用的一个问题:
我有一个有两个QSharedPointer
s 私人班级成员的班级:
在我发送QNetworkAccessManager
帖子的代码中,返回值是一个QNetworkReply
指针。
我想将此指针传递给我的QSharedPointer
ie m_nr
。我试过了:
但是崩溃了,然后我尝试了:
但也崩溃了。
如何将QNetworkReply
指针正确传递给我的QSharedPointer
?