我遇到了一个问题,不确定该如何解决...
我们有一个通用的对象池。当请求对象时,池会返回指向第一个可用实例的 QSharedPointer
,并指定自定义删除器。删除器仅在 QSharedPointer
实例引用计数为 0 时将对象返回到池中。
对于普通对象,一切正常工作。如果编译时使用的是 Qt 5,则对于继承自 QObject
的对象也可以正常工作。
然而,在使用 Qt 4.6 编译时,问题就开始出现了:当请求同一对象的第二个实例时,应用程序会因以下错误而退出:
"QSharedPointer: pointer xxx already has reference counting"
我编写了一个简单的测试:
QObject* obj = new QObject();
QSharedPointer<QObject> p(obj, deleter); // deleter here does nothing
p.clear();
QSharedPointer<QObject> p2(obj, deleter); // this crashes the app
当在Qt 4.6中编译时,这肯定会失败。再说一遍:在QT 5.x中运行良好。
查看Qt源代码,可以发现4.6在将此QObject用作QSharedPointer参数时初始化了内部引用计数器。这样做是为了确保没有两个智能指针可以指向同一个对象,并且它只在析构函数中重置。
Qt5不检查QObject实例被封装到智能指针中的引用计数器值,因此它可以正常工作。
有人知道旧版本Qt的任何解决方法吗?是否有完全重置内部Qt状态(包括引用计数器)的方法?欢迎提供任何提示。
std::shared_ptr
吗?如果你的编译器足够新并支持它,那么它可能更适合你的需求。你的使用似乎不是QSharedPointer
设计的主要用途,因此 Qt 的未来更改可能会带来一些意外。 - hyde