QMap и std::unique_ptr

Я пытаюсь предотвратить голые указатели, предотвратить утечку памяти и т. д. Я также хочу сопоставить 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?


person Cheiron    schedule 28.04.2013    source источник
comment
Это потому, что контейнеры Qt и указатели Qt, откровенно говоря, дерьмо. Используйте std::map, особенно если вы уже используете std::unique_ptr. Или неправильное использование QSharedPointer.   -  person Lol4t0    schedule 28.04.2013
comment
@ Lol4t0 Это сильное заявление, есть доказательства, подтверждающие это?   -  person cmannett85    schedule 28.04.2013
comment
@ cmannett85, этот, QScopedPointer не поддерживает семантику перемещения, контейнеры Qt рассматривают возможность использования итератора в качестве модификации (поэтому qvector.begin() не является потокобезопасным), только неупорядоченный набор, реализация хеш-функции сложна, и вы не можете указать ее напрямую и так далее.   -  person Lol4t0    schedule 28.04.2013


Ответы (2)


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

Какие реализации интеллектуальных указателей C++ доступны?

как уже упоминалось, вы можете использовать QSharedPointer.

person kiriloff    schedule 28.04.2013
comment
Ближайшим приближением к unique_ptr в Qt будет QScopedPointer. Но поскольку он не реализует семантику перемещения, он бесполезен во всех случаях, кроме самых простых. - person relgukxilef; 19.09.2019

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

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

person cmannett85    schedule 28.04.2013
comment
Я не пытаюсь скопировать его в qmap, я std::move его в qmap. Проблема в том, что QMap копирует их в свою внутреннюю структуру данных, что и является реальной проблемой. Вот почему я утверждаю, что проблема в исходном коде QMap, а не в моем коде (что не означает, что это не моя вина, но, по крайней мере, я достаточно умен, чтобы переместить unique_ptr, а не просто скопировать его). - person Cheiron; 29.04.2013
comment
@Cheiron Тогда вы должны были указать это в своем вопросе. - person cmannett85; 29.04.2013