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

c++ - 通过共享指针调用成员函数的成本是多少?

人们经常说取消引用智能指针不会对性能产生显着影响。(例如这里:C 智能指针性能

我现在想知道这是不是真的。我知道它可能是,如果对引用的对象的操作是原子的。

基于此片段的代码思考:

doWork()将被永久执行,并且不时setDataProvider()从第二个线程调用。相当普通的智能指针使用场景。

普遍的共识认为这setDataProvider()有一些额外的成本,因为锁保护的引用计数必须改变,但m_provider->getSomeData()没有。据说它与普通的指针解引用相当,至少不需要昂贵的锁定。

但这怎么能行呢?让我们假设,getSomeData()它不是原子操作,它可能有一些逻辑和显着的执行时间。

执行时如何*m_provider防止被删除getSomeData()?该类可能是该对象的唯一所有者。覆盖m_provider会将指针的引用计数减一。要么m_provider->getSomeData()暂时必须提高引用计数,要么在运行时保护对象不被删除getSomeData()

在这两种情况下,都需要一些昂贵的同步/锁定机制。

附录:我在示例中使用了标准shared_ptr,因为我一般对此感到疑惑。但是真正的代码使用QSharedPointer所以我对此特别感兴趣。我天真地假设两者都具有相同的线程安全性,这可能是错误的。

0 投票
2 回答
8579 浏览

c++ - Qt 应用程序有自动垃圾收集吗?

我正在研究这个,但我没有看到一个确凿的答案。Qt 小部件应用程序在退出时是否会清理内存?从 QObject 派生有什么不同吗?如果有垃圾收集,为什么会有QSharedPointer类?我从我的代码的以下上下文中询问。

现在我syncProcess会在应用程序退出时被清理吗?如果用户在不退出的情况下调用此函数一千次,会造成内存泄漏吗?

更新

鉴于我上面的函数经常被多次调用,是声明QProcess一个成员变量更好还是仅仅用于QSharedPointer改进上面的代码?

0 投票
1 回答
1569 浏览

c++ - QList::contains 带有一个 QSharedPointer

所以我有一个类,它有一个 id 数据成员,我在 a 中使用它,QList<QSharedPointer<MyClass>>我不确定如何去检查它是否有一个现有的 id QList。我将如何完全按照QList::contains需要 aQSharedPointer<MyClass>&而不是 aMyClass*

我应该只使用使用 id 作为键的 QHash 吗?

0 投票
1 回答
952 浏览

c++ - QCache 和 QSharedPointer

问题是,我有一个QVectorofQSharedPointer并且我想把它们的一部分放到我的QCache. 如何插入共享指针QCache?如果我将指针设置为我的缓存但销毁其中的QVector和共享指针会发生什么?内存会被释放,我的缓存会指向无处吗?

0 投票
1 回答
627 浏览

c++ - 访问 QSharedPointer 对象时出现分段错误

我编写了一个小的示例应用程序代码,如下所示。

当我第二次打印调试消息时,它会显示分段错误和应用程序崩溃。根据 QSharedPointer 的文档,它可能会在访问元素后第一次删除指针。

我想要 QSharedPointer nav = m->getINav(); 进入while循环本身,因为这是我真实场景问题的一种虚拟应用程序。

我不知道如何使这个工作,任何帮助将不胜感激。提前致谢。

0 投票
0 回答
660 浏览

c++ - 使用 QSharedPointers 作为值迭代 Qmap

我有一个包含 QSharedPointers 作为值的 QMap。每次我尝试遍历地图并 qDebug 结果时,我都会遇到内存处理错误。

地图的值是继承自 QObject 的 Team 类的对象。

QMap 定义:

执行:

团队地图内容:

  • ("Detroit", Team), // Team 对象,参数“Detroit”为城市,“Joe Louis Arena”为竞技场。
  • ("Pittsburgh", Team) // 参数“Pittsburgh”为城市,“Mellon arena”为参数的 Team 对象。

qDebug 输出为:

“底特律” - “梅隆竞技场”
“” - “梅隆竞技场”

这里会发生什么?为什么输出从正确的对象和下一个对象的区域中获取城市?

我来自 python 背景,显然这里的内存处理不正确。但是我已经搜索了示例并且不知道这里有什么问题。

我也尝试从地图中获取键并使用它从地图中搜索值,但是在第一次循环后程序崩溃。

0 投票
0 回答
166 浏览

c++ - QSharedPointer 被提前销毁

我将 QSharedPointer 用于包含插槽函数的对象。我的期望是,即使包含此指针的对象被销毁,但它会继续存在并处理QProcess::finished信号,但事实并非如此。

我创建一个QProcess并将其连接到插槽。Pdf 对象很快就会被破坏,所以我使用 QSharedPointer 使m_symLinks对象保持活动状态并处理finished信号,但在处理它之前它也会死掉。

头文件是:

0 投票
1 回答
1850 浏览

c++ - 了解 QScopedPointer 通过引用传递

我一直在尝试了解如何将其作为 const 引用传递。

我有以下课程:

在我的 MainWindow 类中,我将其定义为:

Storage类是如何定义的:

在 StorageData SetDBContext() 中,我尝试使用以下内容分配它:

然后在 MainWindow 构造函数中初始化它:

在 StorageData 函数 SetDBContext() 中使用以下内容:

我收到一个错误:

'QScopedPointer>::operator =' : 无法访问在类 'QScopedPointer>' 中声明的私有成员

更新

使用 QSharedPointer 和 QWeakPointer 的技巧。这是使用这两个指针的有效方法吗?我也在 A 类和 B 类上正确使用 clear() 吗?

在构造函数中:

在析构函数中:

0 投票
2 回答
925 浏览

c++ - 为什么 QSharedPointer::创建不完整对象的调用析构函数?

我有以下代码示例:

上述代码的输出是:

但是,如果我取消注释与std::make_shared输出的行如下:

那么为什么QSharedPointer::create调用不完整对象的析构函数呢?这是一个错误还是我错过了什么?

我用MSVC2013+Qt 5.5.1MSVC2015+ Qt 5.6(从源代码构建)尝试了它。结果是一样的。

0 投票
1 回答
408 浏览

c++ - 我们应该在 Qt 中使用哪种内存管理方法?

我对编程很陌生,因为我仍在学习如何有效地编码,所以我的问题可能看起来有点奇怪。

当我学习如何使用 Qt 编码时,我知道 Qt 有一个内存管理方法,当它本身被删除时,父级会删除它的所有子级,然后还有QSharedPointer很多其他智能指针的东西(或者你可能会提到boost::shared_ptr)。

我理解这两种方法到底是如何工作的,但我的问题是,当涉及到 Qt 中整个系统结构的设计时,我是否应该让我的大部分类成为 QT 的子类QObject并将所有权移交给 QT 以进行内存管理,或者简单地使用boost::shared_ptrorQSharedPointer东西来避免潜在的内存泄漏?

因为如果我们同时采用这两种技术有很多问题需要考虑,因为它可能会导致双重删除问题。

那么哪种技术具有更好的性能或在设计中哪种更好?