问题标签 [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++ - 通过共享指针调用成员函数的成本是多少?
人们经常说取消引用智能指针不会对性能产生显着影响。(例如这里:C 智能指针性能)
我现在想知道这是不是真的。我知道它可能是,如果对引用的对象的操作是原子的。
基于此片段的代码思考:
doWork()
将被永久执行,并且不时setDataProvider()
从第二个线程调用。相当普通的智能指针使用场景。
普遍的共识认为这setDataProvider()
有一些额外的成本,因为锁保护的引用计数必须改变,但m_provider->getSomeData()
没有。据说它与普通的指针解引用相当,至少不需要昂贵的锁定。
但这怎么能行呢?让我们假设,getSomeData()
它不是原子操作,它可能有一些逻辑和显着的执行时间。
执行时如何*m_provider
防止被删除getSomeData()
?该类可能是该对象的唯一所有者。覆盖m_provider
会将指针的引用计数减一。要么m_provider->getSomeData()
暂时必须提高引用计数,要么在运行时保护对象不被删除getSomeData()
。
在这两种情况下,都需要一些昂贵的同步/锁定机制。
附录:我在示例中使用了标准shared_ptr
,因为我一般对此感到疑惑。但是真正的代码使用QSharedPointer
所以我对此特别感兴趣。我天真地假设两者都具有相同的线程安全性,这可能是错误的。
c++ - Qt 应用程序有自动垃圾收集吗?
我正在研究这个,但我没有看到一个确凿的答案。Qt 小部件应用程序在退出时是否会清理内存?从 QObject 派生有什么不同吗?如果有垃圾收集,为什么会有QSharedPointer
类?我从我的代码的以下上下文中询问。
现在我syncProcess
会在应用程序退出时被清理吗?如果用户在不退出的情况下调用此函数一千次,会造成内存泄漏吗?
更新
鉴于我上面的函数经常被多次调用,是声明QProcess
一个成员变量更好还是仅仅用于QSharedPointer
改进上面的代码?
c++ - QList::contains 带有一个 QSharedPointer
所以我有一个类,它有一个 id 数据成员,我在 a 中使用它,QList<QSharedPointer<MyClass>>
我不确定如何去检查它是否有一个现有的 id QList
。我将如何完全按照QList::contains
需要 aQSharedPointer<MyClass>&
而不是 aMyClass*
我应该只使用使用 id 作为键的 QHash 吗?
c++ - QCache 和 QSharedPointer
问题是,我有一个QVector
ofQSharedPointer
并且我想把它们的一部分放到我的QCache
. 如何插入共享指针QCache
?如果我将指针设置为我的缓存但销毁其中的QVector
和共享指针会发生什么?内存会被释放,我的缓存会指向无处吗?
c++ - 访问 QSharedPointer 对象时出现分段错误
我编写了一个小的示例应用程序代码,如下所示。
当我第二次打印调试消息时,它会显示分段错误和应用程序崩溃。根据 QSharedPointer 的文档,它可能会在访问元素后第一次删除指针。
我想要 QSharedPointer nav = m->getINav(); 进入while循环本身,因为这是我真实场景问题的一种虚拟应用程序。
我不知道如何使这个工作,任何帮助将不胜感激。提前致谢。
c++ - 使用 QSharedPointers 作为值迭代 Qmap
我有一个包含 QSharedPointers 作为值的 QMap。每次我尝试遍历地图并 qDebug 结果时,我都会遇到内存处理错误。
地图的值是继承自 QObject 的 Team 类的对象。
QMap 定义:
执行:
团队地图内容:
- ("Detroit", Team), // Team 对象,参数“Detroit”为城市,“Joe Louis Arena”为竞技场。
- ("Pittsburgh", Team) // 参数“Pittsburgh”为城市,“Mellon arena”为参数的 Team 对象。
qDebug 输出为:
“底特律” - “梅隆竞技场”
“” - “梅隆竞技场”
这里会发生什么?为什么输出从正确的对象和下一个对象的区域中获取城市?
我来自 python 背景,显然这里的内存处理不正确。但是我已经搜索了示例并且不知道这里有什么问题。
我也尝试从地图中获取键并使用它从地图中搜索值,但是在第一次循环后程序崩溃。
c++ - QSharedPointer 被提前销毁
我将 QSharedPointer 用于包含插槽函数的对象。我的期望是,即使包含此指针的对象被销毁,但它会继续存在并处理QProcess::finished
信号,但事实并非如此。
我创建一个QProcess
并将其连接到插槽。Pdf 对象很快就会被破坏,所以我使用 QSharedPointer 使m_symLinks
对象保持活动状态并处理finished
信号,但在处理它之前它也会死掉。
头文件是:
c++ - 了解 QScopedPointer 通过引用传递
我一直在尝试了解如何将其作为 const 引用传递。
我有以下课程:
在我的 MainWindow 类中,我将其定义为:
Storage类是如何定义的:
在 StorageData SetDBContext() 中,我尝试使用以下内容分配它:
然后在 MainWindow 构造函数中初始化它:
在 StorageData 函数 SetDBContext() 中使用以下内容:
我收到一个错误:
'QScopedPointer>::operator =' : 无法访问在类 'QScopedPointer>' 中声明的私有成员
更新
使用 QSharedPointer 和 QWeakPointer 的技巧。这是使用这两个指针的有效方法吗?我也在 A 类和 B 类上正确使用 clear() 吗?
在构造函数中:
在析构函数中:
c++ - 为什么 QSharedPointer::创建不完整对象的调用析构函数?
我有以下代码示例:
上述代码的输出是:
但是,如果我取消注释与std::make_shared
输出的行如下:
那么为什么QSharedPointer::create
调用不完整对象的析构函数呢?这是一个错误还是我错过了什么?
我用MSVC2013
+Qt 5.5.1
和MSVC2015
+ Qt 5.6
(从源代码构建)尝试了它。结果是一样的。
c++ - 我们应该在 Qt 中使用哪种内存管理方法?
我对编程很陌生,因为我仍在学习如何有效地编码,所以我的问题可能看起来有点奇怪。
当我学习如何使用 Qt 编码时,我知道 Qt 有一个内存管理方法,当它本身被删除时,父级会删除它的所有子级,然后还有QSharedPointer
很多其他智能指针的东西(或者你可能会提到boost::shared_ptr
)。
我理解这两种方法到底是如何工作的,但我的问题是,当涉及到 Qt 中整个系统结构的设计时,我是否应该让我的大部分类成为 QT 的子类QObject
并将所有权移交给 QT 以进行内存管理,或者简单地使用boost::shared_ptr
orQSharedPointer
东西来避免潜在的内存泄漏?
因为如果我们同时采用这两种技术有很多问题需要考虑,因为它可能会导致双重删除问题。
那么哪种技术具有更好的性能或在设计中哪种更好?