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

c++ - 如何以正确的方式从容器中删除 QSharedPointer

QVector<QSharedPointer<SomeData> > DataVec在一个大型的面向对象项目中作为一类领域。程序在循环执行代码部分期间内存溢出,其中分配了大内存,由 QSharedPointers 控制。

在程序运行周期中,DataVec填充

QSharedPointer调用后将被删除(释放)DataVec.pop.back()或?DataVec.clear()

我想不是。我们必须显式调用析构函数QSharedPointer(我在 Qt 中也看不到类似 boost::shared_ptr::reset() 的方法)。然后,如果我们没有更多指向相关实例的指向,SomeData则将调用默认析构函数(SomeData 只有标准 Qt 容器作为字段),并且内存将被释放。现在,我只做:看来,我只是松散了指向未发布数据的指针(执行后,valgrind 表明我肯定丢失了块,我想它们来自这里)。QSharedPointersSomeDatapop_back()

所以,最后,我是对的吗?我怎样才能QSharedPointer以正确的方式从容器中删除?

编辑 1: Qt 中类似 boost::shared_ptr::reset() 的方法是QSharedPointer::clear().

0 投票
2 回答
3457 浏览

c++ - QSharedPointer::isNull() 和 operator!() 的区别

在 Qt 文档中,我们读到:

这两个功能有什么区别?这很清楚什么是对空指针的引用,但在这里意味着什么

“如果对象为空”?

什么决定是否QSharedPointer 为 null?这些函数是如何对应的QSharedPointer::data() != null

0 投票
1 回答
3813 浏览

c++ - QSharedPointer::create()

在 Qt 4 中,我有以下数组:

如何将这两种分配与新的 Qt 5 创建功能合二为一?

0 投票
2 回答
3029 浏览

c++ - 来自原始指针的 QSharedPointer

我目前有这样的事情:

现在我有一个指向 foo 的原始指针,也称为rawfoo. 我怎样才能让 foo 点拥有原始指针并开始指向它。我知道通过共享指针提升我们可以使用boost::make_shared 我们如何做到这一点QSharedPointer

我想做这样的事情:

0 投票
1 回答
287 浏览

qt - 对象的 getter 应该返回引用指针还是 QSharedPointers?

我在内部(私有)将一个对象存储为 QSharedPointer(因此它将删除它)。对于 getter,我应该返回原始指针还是 QSharedPointer 的引用?

我也不确定http://qt-project.org/wiki/SharedPointersAndQmlOwnership是什么意思。有人可以为我总结一下吗?

0 投票
1 回答
3030 浏览

c++ - 访问 QList 和 QSharedPointer 中的引用元素

有一个名为 QList 的成员变量m_noteList,其中包含 class 的 QSharedPointer 元素Note

如果创建了新注释,则其引用将附加到列表中:

对于每个 Note 元素,其指针位于 m_noteList 中,我想获取其标题并将其添加到我的上下文菜单中。目的是单击该标题以打开注释:

我收到一个错误

基本上我想访问在m_noteList. 我怎么做?我认为 withm_noteList[i]可以访问该元素,但显然编译器需要一些 type QSharedPointer。为什么?

0 投票
2 回答
31914 浏览

c++ - Qt 中的 QPointer、QSharedPointer 和 QWeakPointer 类有什么区别?

我已经阅读了关于QPointer,QSharedPointerQWeakPointerclasses 的 Qt 文档。它说:

  1. QPointer是一个模板类,它提供指向 Qt 对象的受保护指针,其行为类似于普通的 C++ 指针,除了当引用的对象被销毁并且不产生“悬空指针”时它自动设置为 0。

  2. QSharedPointer类持有对共享指针的强引用。

  3. QWeakPointer类持有对共享指针的弱引用。

我的问题是“这些课程有什么区别?”。即指向对象的指针和对指针的引用有什么区别?它们都是指向具有不同机制和行为的对象的指针吗?

0 投票
2 回答
1396 浏览

c++ - 在堆栈上分配和从函数返回 QSharedPointer

与哑指针不同,我希望我可以QSharedPointer在函数中的堆栈上创建一个,然后将其作为返回值返回以分配给另一个QSharedPointer相同类型的,对吧?通常,这样的指针将指向现在超出范围的内存,因此该指针无效,但QSharedPointer如果它的另一个副本仍然存在,a 将确保它保留在内存中,我希望。这个对吗?

0 投票
1 回答
815 浏览

c++ - Making a QSharedPointer

For historical reasons, I use QSharedPointer<T> in my software. At some points, we want to store boost::shared_ptr<T> that point to the same data, and which should keep alive the instances of the QSharedPointer<T>.

The common way to do this is to keep a copy of the other smart pointer within the deleter of boost::shared_ptr<T>. But to prevent the deleter from having different types for different Ts, which would prevent easily getting a QSharedPointer back with boost::get_deleter, when the corrresponding boost::shared_ptr has been upcast, I wanted to store the original QSharedPointer<T> as a QSharedPointer<void> within the deleter, as opposed to using the T.

But I find that QSharedPointer is not up to the task, as it throws errors like "reference to void can't be done", when compiling its header.

Does anyone have an idea on how to make this work without exposing T into the deleter?

0 投票
2 回答
1182 浏览

c++ - QObject 实例池

我有一个问题我不知道如何解决..

我们有通用对象池。当请求对象时,池返回QSharedPointer到第一个可用实例,并指定了自定义 Deleter。当QSharedPointer实例引用计数为 0 时,删除器只是将对象返回到池中。对于普通对象,一切正常。QObject在 Qt 5 中编译时,它也适用于后继者。

但是,如果在 Qt 4.6 中编译 - 问题开始了:当第二次请求相同的对象时 - 应用程序退出并出现错误:

“QSharedPointer:指针 xxx 已经有引用计数”

我写了简单的测试:

在 Qt 4.6 中编译时肯定会失败。再次:在 QT 5.x 中运行良好。

查看 Qt 源代码,它显示 4.6 在将其用作参数QObject时初始化内部 ref 计数器。这样做是为了确保没有两个智能指针可以指向同一个对象,并且它只会在析构函数中被重置。QObjectQSharedPointer

当实例被包装到智能指针中时,Qt5 不会检查 ref 计数器值QObject,因此它可以工作。

有谁知道旧 Qt 版本的任何解决方法?有什么方法可以完全重置内部 Qt 状态,包括参考计数器?任何提示都非常受欢迎。