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