问题是,我有一个QVector of QSharedPointer,我想把其中的一部分放到我的QCache中。如何插入指向QCache的共享指针?如果我将指针设置为缓存,但销毁了QVector和其中的共享指针,会发生什么情况?会不会释放内存,而我的缓存指向任何地方?
发布于 2015-10-22 14:17:47
如果只放置指向QChache的项的指针,同时由QSharedPointer管理该指针,则这是一个错误。项目对象可以由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对象的副本,并且已经拥有Item实例所有权的其他QSharedPointer应该正确地初始化QSharedPointer对象。
https://stackoverflow.com/questions/33280524
复制相似问题