【问题标题】:QCache and QSharedPointerQCache 和 QSharedPointer
【发布时间】:2015-10-22 12:00:35
【问题描述】:

问题是,我有一个 QVectorQSharedPointer,我想将其中的一部分放到我的 QCache 中。如何插入指向QCache 的共享指针?如果我将指针设置为我的缓存但销毁QVector 和其中的共享指针会发生什么?内存会被释放,我的缓存会指向无处吗?

【问题讨论】:

  • 共享指针使用引用计数,因此在指向它的最后一个 QSharedPointer 被销毁之前,QSharedPointer 不会删除任何内容。

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


【解决方案1】:

如果您只将指向您的项目的指针指向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 对象应该由已经拥有Item 实例所有权的其他QSharedPointer 正确初始化。

【讨论】:

  • 谢谢,我会试试这个。但在另一个线程中,有人告诉我不要在 QCache 中使用智能指针。见这里:stackoverflow.com/a/33158035/5447060
  • @adapto 那是因为您在问题中没有提到将在QCache 之外使用相同的对象。如果您分配一个新对象然后将其传递给QCache 是可以的,但在这种情况下,该指针不应由任何其他对象拥有。
  • 但在这种情况下,QCache 中不需要 shared_ptr。 OP 可以简单地做到这一点:cache.insert(1, new Item(item));
  • @SergeyA OP 希望将这些指针保留在外部向量中,但QCache 可以在决定在插入新项目期间腾出空闲位置时删除项目,因此该向量中的指针变得无效。跨度>
  • 不幸的是,QCache 是 unique_ptrs 的容器。因此,要与外部 shared_prts 共享该指针,除了用 shared_prt 包装 QCache 托管项之外没有其他解决方案。
猜你喜欢
  • 1970-01-01
  • 2012-09-19
  • 2017-06-09
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多