Russian Qt Forum

Qt => Вопросы новичков => Тема начата: KSergeyP от Апрель 03, 2023, 08:40



Название: QScopedPointer и QList
Отправлено: KSergeyP от Апрель 03, 2023, 08:40
Добрый день!
Возможно ли создать QList<QScopedPointer>? Точнее создать то его можно, а вот элементы добавить не получается.
Проблема в том что при вызове append указатель копируется в лист, а копирование запрещено.
Собственно вопрос можно ли создавать указатель непосредственно сразу в листе, чтобы не было необходимости ничего никуда копировать?
P.S: с SharedPointer таких проблем нет, но хотелось бы разобраться именно с unique/QScopedPointer

И второй вопрос, как у умных указателей (shared) с поток безопасностью? Что будет если один поток пытается сделать копию, а в другом в этот момент уничтожается последний указатель?


Название: Re: QScopedPointer и QList
Отправлено: kambala от Апрель 03, 2023, 09:03
std::unique_ptr можно перемещать (std::move), а QScopedPointer видимо нельзя (не вижу соответствующего конструктора)

std::shared_ptr потокобезопасен, Qt'шный вариант тоже https://doc.qt.io/qt-6/qsharedpointer.html#thread-safety


Название: Re: QScopedPointer и QList
Отправлено: KSergeyP от Апрель 03, 2023, 11:30
std::unique_ptr можно перемещать (std::move), а QScopedPointer видимо нельзя (не вижу соответствующего конструктора)

std::shared_ptr потокобезопасен, Qt'шный вариант тоже https://doc.qt.io/qt-6/qsharedpointer.html#thread-safety

В QList не перемещается. Qt 5.12
    QList<unique_ptr<int>> IntList;
    unique_ptr<int> p = make_unique<int>(1);
    IntList.append(std::move(p));
Не собирается:
    error: use of deleted function 'std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = int; _Dp = std::default_delete<int>]'


Название: Re: QScopedPointer и QList
Отправлено: kambala от Апрель 03, 2023, 15:06
QList не умеет добавлять && элементы, может только другой объект QList таким образом добавить (т.е. можно создать QList in-place и добавить). а вот например std::vector может.