【问题标题】:QMap and std::unique_ptrQMap 和 std::unique_ptr
【发布时间】:2013-04-28 12:58:40
【问题描述】:

我试图防止裸指针,防止内存泄漏等。我还想将int 映射到INuiSensor*。由于我也在使用 Qt,所以我尝试使用 QMap<int, std::unique_ptr<INuiSensor>> 来执行此操作,但 QMap 的源代码使这变得不可能:

template <class Key, class T>
Q_INLINE_TEMPLATE typename QMap<Key, T>::iterator QMap<Key, T>::insert(const Key &akey, const T &avalue)
{
    detach();
    Node *n = d->root();
    Node *y = d->end();
    Node *last = 0;
    bool  left = true;
    while (n) {
        y = n;
        if (!qMapLessThanKey(n->key, akey)) {
            last = n;
            left = true;
            n = n->leftNode();
        } else {
            left = false;
            n = n->rightNode();
        }
    }
    if (last && !qMapLessThanKey(akey, last->key)) {
        last->value = avalue;
        return iterator(last);
    }
    Node *z = d->createNode(akey, avalue, y, left);
    return iterator(z);
}

行:

last->value = avalue;

是造成问题的原因:您不能直接在 unique_ptr 上使用 = 运算符。所以现在我很困惑下一步该做什么。是否可以以其他方式使用 QMap 和 unique_ptr ?出于某种原因,使用 QMap 和 unique_ptr 的整个想法是否愚蠢?在使用 QMap 的同时如何防止使用裸指针?

【问题讨论】:

  • 坦率地说,这是因为 Qt 容器和 Qt 指针都是垃圾。使用 std::map,特别是如果您已经在使用 std::unique_ptr。或者误用QSharedPointer.
  • @Lol4t0 这是一个强有力的声明,有证据支持它吗?
  • @cmannett85,这个,QScopedPointer 不支持移动语义,Qt 容器考虑将迭代器作为修改(这就是为什么 qvector.begin() 不是线程安全的),只有无序集,散列函数实现很棘手,你不能直接指定一个等等。

标签: c++ qt unique-ptr qmap


【解决方案1】:

使用 Qt 容器,你应该使用 Qt 智能指针实现。有关此线程中不同实现的更多信息。

What C++ Smart Pointer Implementations are available?

如前所述,您可以使用 QSharedPointer。

【讨论】:

  • Qt 中与unique_ptr 最接近的近似值是QScopedPointer。但是由于它没有实现移动语义,所以除了最简单的用例之外,它在所有情况下都是无用的。
【解决方案2】:

这当然行不通,您已经创建了一个唯一指针,然后您尝试将其复制QMap中。

使用QSharedPointer。当所有对INuiSensor* 实例的引用都被删除后,该实例将被删除。

【讨论】:

  • 我不是想把它复制到 qmap 中,我是 std::moving 它到 qmap 中。问题是 QMap 他们将其复制到其内部数据结构中,这是实际问题。这就是为什么我说问题出在 QMap 源代码而不是我的代码中(这并不意味着它不是我的错,但至少我足够聪明,可以移动一个 unique_ptr,而不仅仅是复制它)。跨度>
  • @Cheiron 那么你应该在你的问题中说明这一点。
猜你喜欢
  • 1970-01-01
  • 2022-01-20
  • 2017-05-15
  • 2016-05-10
  • 1970-01-01
  • 1970-01-01
  • 2014-08-26
  • 2014-02-27
  • 2016-08-03
相关资源
最近更新 更多