【发布时间】: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