我有一个问题我不知道如何解决..
我们有通用对象池。当请求对象时,池返回QSharedPointer
到第一个可用实例,并指定了自定义 Deleter。当QSharedPointer
实例引用计数为 0 时,删除器只是将对象返回到池中。对于普通对象,一切正常。QObject
在 Qt 5 中编译时,它也适用于后继者。
但是,如果在 Qt 4.6 中编译 - 问题开始了:当第二次请求相同的对象时 - 应用程序退出并出现错误:
“QSharedPointer:指针 xxx 已经有引用计数”
我写了简单的测试:
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
时初始化内部 ref 计数器。这样做是为了确保没有两个智能指针可以指向同一个对象,并且它只会在析构函数中被重置。QObject
QSharedPointer
当实例被包装到智能指针中时,Qt5 不会检查 ref 计数器值QObject
,因此它可以工作。
有谁知道旧 Qt 版本的任何解决方法?有什么方法可以完全重置内部 Qt 状态,包括参考计数器?任何提示都非常受欢迎。