QCache和QSharedPointer

时间:2015-10-22 12:00:36

标签: c++ qt smart-pointers qvector qsharedpointer

问题是,我有QVector QSharedPointer,我想将其中的一部分放到我的QCache。如何插入指向QCache的共享指针?如果我将指针设置为我的缓存但会破坏QVector及其中的共享指针会发生什么?内存是否会被释放而我的缓存无处可寻?

1 个答案:

答案 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}}实例。