3

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

4

1 回答 1

3

如果您只放置一个指向您的项目的指针,QChache同时该指针由QSharedPointer. 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对象应该由QSharedPointer已经拥有该Item实例所有权的其他对象正确初始化。

于 2015-10-22T14:17:47.023 回答