问题是,我有QVector
QSharedPointer
,我想将其中的一部分放到我的QCache
。如何插入指向QCache
的共享指针?如果我将指针设置为我的缓存但会破坏QVector
及其中的共享指针会发生什么?内存是否会被释放而我的缓存无处可寻?
答案 0 :(得分:3)
如果只将指向项目的指针放到QChache
并且同时指针由QSharedPointer
管理,则会出现错误。 QSharedPointer
析构函数可以销毁item对象,因此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
正确初始化{1}}实例。