QCache and QSharedPointer

QCache and QSharedPointer

本文关键字:QSharedPointer and QCache      更新时间:2023-10-16

问题是,我有一个QSharedPointerQVector,我想把它们的一部分到我的QCache。我如何插入一个共享指针到QCache ?如果我将指针设置为我的缓存,但销毁QVector和其中的共享指针,会发生什么?内存会被释放,我的缓存不会指向任何地方吗?

如果你把一个指针指向你的项目QChache,同时这样的指针是由QSharedPointer管理的,这是一个bug。item对象可以被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对象应该由已经拥有Item实例所有权的其他QSharedPointer正确初始化。