QCache 和 QSharedPointer

QCache and QSharedPointer

问题是,我有一个 QVectorQSharedPointer,我想把其中的一部分放到我的 QCache 中。如何插入指向 QCache 的共享指针?如果我将指针设置为缓存但销毁 QVector 和其中的共享指针,会发生什么情况?内存会不会被释放而我的缓存指向无处?

如果您只将指向您的项目的指针放置到 QChache 并且同时该指针由 QSharedPointer 管理,则这是一个错误。项目对象可以被 QSharedPointer 析构函数销毁,因此 QChache 将具有无效指针。这是一个普遍的问题,您不能拥有彼此不认识的指针的不同所有者。如果您通过 QSharedPointer<Item> 管理指针,那么 QChache 不应直接与 Item 一起使用,它应该仅与 QSharedPointer<Item> 一起使用,例如:

// wrong
QCache<int, Item> cache;
QVector<QSharedPointer<Item> > vec;
Item *item = new Item;
vec.push_back(QSharedPointer<Item>(item));
cache.insert(1, item);
// or
cache.insert(1, vec.at(0).data());

// also wrong
QCache<int, <QSharedPointer<Item> > cache;
vec.push_back(QSharedPointer<Item>(item));
cache.insert(1, new QSharedPointer<Item>(item));
// here two different instances of QSharedPointer are initialized
// by the same pointer 'item'

// correct
QCache<int, <QSharedPointer<Item> > cache;
cache.insert(1, new QSharedPointer<Item>(vec.at(0)));

因此,QCache 应该有自己的动态分配的 QSharedPointer 对象的副本,并且 QSharedPointer 对象应该由已经拥有的其他 QSharedPointer 正确初始化Item 实例。