问题标签 [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 回答
1425 浏览

c++ - QSharedPointer 作为方法参数或方法返回值的良好做法?

QSharedPointer关于如何将对象用作方法参数或方法的返回值,是否有任何好的做法或规定?

按价值:

或更好的参考:

当然,在第二个版本中,我避免了引用计数器的增加和QSharedPointer对象的更改。但是有没有严格的方法我必须怎么做?

0 投票
1 回答
308 浏览

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

0 投票
1 回答
515 浏览

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,我想知道我是否缺少某些东西,或者可能是什么原因造成的?

0 投票
1 回答
720 浏览

c++ - QSharedPointer 在发射中被破坏

我对 Qt 很陌生,QSharedPointer在信号内部传递时遇到了一些问题。我正在使用两个线程(UI 和一个工作线程)。worker 使用包含自定义 QObject 的 QSharedPointer 的信号向 UI 发送信号:

我将工作人员found与窗口连接起来onFoundQt::QueuedConnection因为他们生活在不同的线程中,因此通信必须是异步的。

现在我观察到以下行为,当我通过最后一个QSharedPointer引用我的对象时:

  • 信号 moc 将对我的指针的引用投射到void*并对其进行归档。
  • 该函数返回导致共享指针和相应的对象被销毁。

这不是我所期望的——尽管它是合理的。QSharedPointer 通常是否设计为通过这种方式传递信号?如果是这样,是否有一种机制可以在排队时保留参考?

我考虑了以下解决方案,但我对它们都不完全满意:

  1. 在某处保留引用,以便在排队时保留引用。但是在哪里是一个合理的地方,我应该什么时候放手。
  2. 建立连接Qt::DirectConnection,但我仍然必须以某种方式切换线程(与以前相同的情况)
  3. 引入一个带有std::function参数的新信号/插槽,用于传递要在目标线程中执行的 lambda 函数并捕获我的共享指针的副本。(这是我目前的解决方案,但它并不优雅,不是吗?)

您还有其他建议或想法吗?

0 投票
1 回答
53 浏览

c++ - Qt 4.8.7 内存伪影

我需要使用 Qt 4.8.7 for Embedded Linux 来创建一个非常简单的测试项目。项目包括 2 种形式 - 对话框(由 QTextEdit 和按钮组成。按钮清除 QTextEdit 和 QClipboard)和 MainWindow(由执行对话框的按钮组成)。

我编辑文本,复制其中的一部分。然后清除编辑器和剪贴板。之后我无法粘贴文本,但我使用 gcore 转储内存并查看我复制的文本(html 形式的几个副本)。这些对象留在内存中的是什么?这些是临时对象还是内存泄漏?或者我使用不正确的东西。

0 投票
1 回答
712 浏览

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超出范围时删除子对象.

0 投票
0 回答
219 浏览

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的相关方法:

0 投票
1 回答
592 浏览

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.

为什么我需要它?有可能避免吗?

0 投票
0 回答
58 浏览

qt - 将 QSharedPointer 取消引用到 QMultiHash 时崩溃

我有一个指向 QMultiHash 的 QSharedPointer。当我尝试从 QSharedPointer 获取 QMultiHash 时,它搞砸了。我的想法是 QMultiHash 的 QHash 部分是不可访问的。

有什么方法可以解决这个问题,或者是否有另一种方法可以获得 QMultiHash 的向量?

干杯杰夫

0 投票
1 回答
156 浏览

c++ - 使用 QNetworkAccessManager 时智能指针和避免手动内存管理

我有以下类调用一些 HTTP API 请求到服务器:

我以这种方式使用该类:

现在这显然涉及一些手动内存管理,我必须小心不要忘记删除原始指针。我想知道上面的代码是否可以使用QSharedPointer (甚至std::shared_ptr)编写并替换:

和:

然后替换所有实例,reply然后smartReply.get()忘记手动删除回复对象。但是,我不清楚共享指针是否会自动删除对象,因为在我调用的时间范围send()和信号之间QNetworkReply::finished,智能指针会知道原始指针仍在使用中吗?另外,当我删除一个实例时NetworkRequest,共享指针会自动删除QNetworkReply它拥有的吗?