QCache 和 QSharedPointer
QCache and QSharedPointer
问题是,我有一个 QVector
的 QSharedPointer
,我想把其中的一部分放到我的 QCache
中。如何插入指向 QCache
的共享指针?如果我将指针设置为缓存但销毁 QVector
和其中的共享指针,会发生什么情况?内存会不会被释放而我的缓存指向无处?
如果您只将指向您的项目的指针放置到 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
对象的副本,并且 QSharedPointer
对象应该由已经拥有的其他 QSharedPointer
正确初始化Item
实例。
问题是,我有一个 QVector
的 QSharedPointer
,我想把其中的一部分放到我的 QCache
中。如何插入指向 QCache
的共享指针?如果我将指针设置为缓存但销毁 QVector
和其中的共享指针,会发生什么情况?内存会不会被释放而我的缓存指向无处?
如果您只将指向您的项目的指针放置到 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
对象的副本,并且 QSharedPointer
对象应该由已经拥有的其他 QSharedPointer
正确初始化Item
实例。