2013-04-28 3 views
2

Я пытаюсь предотвратить голые указатели, чтобы предотвратить утечку памяти и т. Д. Я также хочу нанести int на INuiSensor*. Поскольку я также использую Qt Я пытался использовать QMap<int, std::unique_ptr<INuiSensor>>, чтобы сделать это, но исходный код QMap делает это невозможным:QMap и std :: unique_ptr

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?

+1

Это потому, что контейнеры Qt и указатели Qt - это дерьмо, откровенно говоря. Используйте std :: map, особенно если вы уже используете 'std :: unique_ptr'. Или _misuse_ 'QSharedPointer'. – Lol4t0

+0

@ Lol4t0 Это сильное заявление, любые доказательства для его поддержки? – cmannett85

+0

@ cmannett85, этот, 'QScopedPointer' не поддерживает семантику перемещения, контейнеры Qt рассматривают возможность использования итератора в качестве модификации (поэтому qvector.begin() не является потокобезопасным), только неупорядоченный набор, реализация хэш-функции сложна, и вы не можете указать один непосредственно и так далее. – Lol4t0

ответ

3

используя контейнер Qt, вы должны использовать реализацию интеллектуальных указателей Qt. Подробнее о различных реализациях в этом потоке.

What C++ Smart Pointer Implementations are available?

, как упоминалось, вы могли бы пойти с QSharedPointer.

0

Конечно, это не сработает, вы создали уникальный указатель, а затем попробуйте копия в QMap.

Использовать QSharedPointer. Когда все ссылки на экземпляр INuiSensor* были удалены, экземпляр будет удален.

+0

Я не пытаюсь скопировать его в qmap, я std :: перемещаю его в qmap. Проблема в том, что QMap их копирует в свою внутреннюю структуру данных, что является реальной проблемой. Вот почему я утверждаю, что проблема заключается в исходном коде QMap, а не в моем коде (что не значит, что это не моя ошибка, но, по крайней мере, достаточно умный, чтобы переместить unique_ptr, а не просто скопировать его). – Cheiron

+0

@Cheiron Тогда вы должны были заявить об этом в своем вопросе. – cmannett85

Смежные вопросы