问题是,我有一个QSharedPointer
的QVector
,我想把它们的一部分到我的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
正确初始化。