问题标签 [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 作为方法参数或方法返回值的良好做法?
QSharedPointer
关于如何将对象用作方法参数或方法的返回值,是否有任何好的做法或规定?
按价值:
或更好的参考:
当然,在第二个版本中,我避免了引用计数器的增加和QSharedPointer
对象的更改。但是有没有严格的方法我必须怎么做?
c++11 - 如何删除我的共享指针指向的内容?
当我运行我的主要方法时,函数 makeEmpty 和 remove 不起作用。我正在将此代码从使用指针转换为使用共享指针,但我对共享指针还不是很熟悉。有关如何执行此操作或任何解决方案的任何见解都将非常有帮助。主要功能是:
这输出:
-2 7 10 20 24 30 35
-2
35
真的
错误的
-2 7 10 20 24 30 35
错误的
-2 7 10 20 24 30 35
c++ - QEnableSharedFromThis::sharedFromThis() 返回 nullptr
我有一个class MyClass
应该能够返回这个包裹在QSharedPointer<MyClass>
.
根据我的理解(和经验),简单地创建新的实例QSharedPointer<MyClass>(this)
并不是要走的路。相反,完成我想要的正确方法是让MyClass
继承QEnableSharedFromThis<MyClass>
提供成员函数sharedFromThis()
。
这个成员函数应该返回this Wrapped inQSharedPointer<MyClass>
而不会出现所有不好的副作用。
但是,当我testSharedThis()
在上面的示例中运行时,sharedFromThis()
总是返回nullptr而不是这个包裹在QSharedPointer<MyClass>
.
我是新手QEnableSharedFromThis
,我想知道我是否缺少某些东西,或者可能是什么原因造成的?
c++ - QSharedPointer 在发射中被破坏
我对 Qt 很陌生,QSharedPointer
在信号内部传递时遇到了一些问题。我正在使用两个线程(UI 和一个工作线程)。worker 使用包含自定义 QObject 的 QSharedPointer 的信号向 UI 发送信号:
我将工作人员found
与窗口连接起来onFound
,Qt::QueuedConnection
因为他们生活在不同的线程中,因此通信必须是异步的。
现在我观察到以下行为,当我通过最后一个QSharedPointer
引用我的对象时:
- 信号 moc 将对我的指针的引用投射到
void*
并对其进行归档。 - 该函数返回导致共享指针和相应的对象被销毁。
这不是我所期望的——尽管它是合理的。QSharedPointer 通常是否设计为通过这种方式传递信号?如果是这样,是否有一种机制可以在排队时保留参考?
我考虑了以下解决方案,但我对它们都不完全满意:
- 在某处保留引用,以便在排队时保留引用。但是在哪里是一个合理的地方,我应该什么时候放手。
- 建立连接
Qt::DirectConnection
,但我仍然必须以某种方式切换线程(与以前相同的情况) - 引入一个带有
std::function
参数的新信号/插槽,用于传递要在目标线程中执行的 lambda 函数并捕获我的共享指针的副本。(这是我目前的解决方案,但它并不优雅,不是吗?)
您还有其他建议或想法吗?
c++ - Qt 4.8.7 内存伪影
我需要使用 Qt 4.8.7 for Embedded Linux 来创建一个非常简单的测试项目。项目包括 2 种形式 - 对话框(由 QTextEdit 和按钮组成。按钮清除 QTextEdit 和 QClipboard)和 MainWindow(由执行对话框的按钮组成)。
我编辑文本,复制其中的一部分。然后清除编辑器和剪贴板。之后我无法粘贴文本,但我使用 gcore 转储内存并查看我复制的文本(html 形式的几个副本)。这些对象留在内存中的是什么?这些是临时对象还是内存泄漏?或者我使用不正确的东西。
c++ - 删除 QSharedPointer 指向的 QObject
在我的项目中,我创建QObject
实例并赋予它们父子关系。我还想跟踪一些带有QSharedPointer
实例的对象。
当一个对象被delete childObject;
或删除时delete parentObject;
,我希望QSharedPointer
实例true
在调用isNull()
.
但是,在删除任何QSharedPointer
指向的对象后,我的程序就会崩溃。
这是我的代码:
仅此一项就使我的程序崩溃。我阅读了文档QSharedPointer
并指出A QSharedPointer object can be created from a normal pointer
,所以我有点困惑为什么QSharedPointer
不能处理指向被删除的对象。
QPointer
没有这个问题,我什至可以调用isNull()
,但是我需要的原因QSharedPointer
是因为将创建一些子对象并且没有给出父对象,此时我希望在所有相关QSharedPointers
超出范围时删除子对象.
c++ - 在 QtTest 中接收分配 QSharedPointer 的致命错误
在 TestGroup_Person 中,当我从 JB_PersonDao 检索 QSharedPointer<-JB_TableRowProt> 并将其分配给 QSharedPointer<-JB_TableRowProt> aGroup_Person(在 .h 中)时,然后我在 TestGroup_Person 的方法中收到此错误。
或者,如果我在每个方法中从 JB_DaoProt 检索 QSharedPointer<-JB_TableRowProt>(并且不将其分配给 QSharedPointer<-JB_TableRowProt> aGroup_Person),它工作正常。
有人可以向我解释为什么这个作业似乎导致了错误吗?
我收到了这个错误:
这是代码:主要:
TestGroup_Person.h
};
TestGroup_Person.cpp:
JB_DaoProt的相关方法:
c++ - 如何正确使用带有 QSharedPointer 的析构函数exec循环停止后?
大家,早安,
我正在使用QSharedPointer
我的类派生自QObject
. 由于它们使用信号/插槽机制,我必须使用QObject::deleteLater()
才能正确销毁它们,例如:
~QObject():“在等待传递的未决事件时删除 QObject 可能会导致崩溃。如果 QObject 存在于与当前执行的线程不同的线程中,则不得直接删除它。请改用 deleteLater(),这将导致事件循环在所有未决事件都传递给它之后删除该对象。”
QSharedPointer 和 QObject::deleteLater
QSharedPointer(X *ptr, Deleter d) : "deleter 参数 d 指定此对象的自定义删除器。当强引用计数降至 0 时,将调用自定义删除器,而不是运算符 delete()。这很有用,例如,改为在 QObject 上调用 deleteLater()"
另请注意,在上一个链接中它是这样写的
"请注意,即使 QSharedPointer 模板参数 T 不一样,也会使用指向 X 类型的指针调用自定义删除器函数。",
但这与构造函数QSharedPointer(X *ptr)的行为完全不同,它说:
“从 Qt 5.8 开始,当对这个 QSharedPointer 的最后一个引用被销毁时,将通过调用 X 的析构函数来删除 ptr(即使 X 与 QSharedPointer 的模板参数 T 不同)。以前,调用了 T 的析构函数。” - (我使用的是 Qt 5.7,所以我期待~T
析构函数)
好吧,最后我想要实现的是使用 调用正确的析构函数(子类的)QSharedPointer
,但由于它是QObject
我需要使用QObject::deleteLater()
的,但在我的测试中我无法实现我的目标。
我发布了一个简单的测试和我得到的结果。
如果我做错了什么,你能告诉我吗?
我对测试的期望是正确的吗?
我对标有“有趣的案例”的案例特别感兴趣
这是结果:
编辑:
我知道QObject::deleteLater行为,特别是:
“如果在主事件循环停止后调用 deleteLater(),则不会删除对象。从 Qt 4.8 开始,如果在没有运行事件循环的线程中调用 deleteLater(),则该对象将被线程完成时销毁。”
但是由于我使用的是 Qt 5.7,所以无论如何我希望在函数结束时调用析构函数,这是我启动的唯一线程(其他线程最终由 Qt 启动的一部分)
编辑 2
(我还编辑了标题)
(问题可能比我预期的要复杂。)
据我所知,没有主线程。所有线程都是平等的,也是应该使用 main 函数隐式创建的第一个线程。它不应该以任何方式特别,对吗?
那么,为什么退出主线程不会QSharedPointer
以正确的方式删除 s 呢?
我发布的是一个测试,在我的真实应用程序中我确实有一个exec()
循环,但是在循环停止之后调用析构函数。
我希望deleteLater()
在线程结束时调用 s 函数,即当我退出主循环时。
PS:为了获得所有的析构函数,我需要一个exec()
循环,正如@dave 所说,但这将是我应用程序中的第二个循环,即:
最后就在return
.
为什么我需要它?有可能避免吗?
qt - 将 QSharedPointer 取消引用到 QMultiHash 时崩溃
我有一个指向 QMultiHash 的 QSharedPointer。当我尝试从 QSharedPointer 获取 QMultiHash 时,它搞砸了。我的想法是 QMultiHash 的 QHash 部分是不可访问的。
有什么方法可以解决这个问题,或者是否有另一种方法可以获得 QMultiHash 的向量?
干杯杰夫
c++ - 使用 QNetworkAccessManager 时智能指针和避免手动内存管理
我有以下类调用一些 HTTP API 请求到服务器:
我以这种方式使用该类:
现在这显然涉及一些手动内存管理,我必须小心不要忘记删除原始指针。我想知道上面的代码是否可以使用QSharedPointer
(甚至std::shared_ptr
)编写并替换:
和:
然后替换所有实例,reply
然后smartReply.get()
忘记手动删除回复对象。但是,我不清楚共享指针是否会自动删除对象,因为在我调用的时间范围send()
和信号之间QNetworkReply::finished
,智能指针会知道原始指针仍在使用中吗?另外,当我删除一个实例时NetworkRequest
,共享指针会自动删除QNetworkReply
它拥有的吗?