Spec-Zone.ru › Qt 5.14

Класс QScopedPointer

Класс QScopedPointer хранит указатель на динамически выделенный объект и удаляет его при уничтожении. Подробнее...

Заголовок: #include <QScopedPointer>
qmake: QT += core
С момента: Qt 4.6
Наследуется от:

QScopedArrayPointer

Этот класс был представлен в Qt 4.6.

  • Список всех членов, включая унаследованные

Примечание: Все функции в этом классе являются повторно-входными.

Открытые функции

QScopedPointer(T *p = ...)
~QScopedPointer()
T * data() const
T * get() const
bool isNull() const
void reset(T *other = ...)
void swap(QScopedPointer<T, Cleanup> &other)
T * take()
bool operator bool() const
bool operator!() const
T & operator*() const
T * operator->() const

Связанные нечлены

bool operator!=(const QScopedPointer<T, Cleanup> &lhs, std::nullptr_t)
bool operator!=(std::nullptr_t, const QScopedPointer<T, Cleanup> &rhs)
bool operator==(const QScopedPointer<T, Cleanup> &lhs, std::nullptr_t)
bool operator==(std::nullptr_t, const QScopedPointer<T, Cleanup> &rhs)

Подробное описание

Ручное управление объектами, выделенными в куче, сложно и подвержено ошибкам, что часто приводит к утечке памяти и трудностям в обслуживании кода. QScopedPointer — это небольшой служебный класс, который существенно упрощает задачу, назначая управляемый стек памяти выделенным в куче, более общее название которого — приобретение ресурсов при инициализации (RAII).

QScopedPointer гарантирует, что объект, на который указывает указатель, будет удален при завершении текущего блока кода.

Рассмотрим эту функцию, которая выделяет память в куче и имеет различные точки выхода:

void myFunction(bool useSubClass)
{
    MyClass *p = useSubClass ? new MyClass() : new MySubClass;
    QIODevice *device = handsOverOwnership();

    if (m_value > 3) {
        delete p;
        delete device;
        return;
    }

    try {
        process(device);
    }
    catch (...) {
        delete p;
        delete device;
        throw;
    }

    delete p;
    delete device;
}

Она усложнена вызовами manual delete. С QScopedPointer код можно упростить до:

void myFunction(bool useSubClass)
{
    // assuming that MyClass has a virtual destructor
    QScopedPointer<MyClass> p(useSubClass ? new MyClass() : new MySubClass);
    QScopedPointer<QIODevice> device(handsOverOwnership());

    if (m_value > 3)
        return;

    process(device);
}

Код, сгенерированный компилятором для QScopedPointer, аналогичен коду при ручном написании. Код, использующий delete, является кандидатом для использования QScopedPointer (и если нет, то, возможно, другого типа интеллектуального указателя, такого как QSharedPointer). QScopedPointer намеренно не имеет конструктора копирования или оператора присваивания, таким образом, владение и жизненный цикл явно сообщаются.

Квалификатор const на обычном указателе C++ также можно выразить с помощью QScopedPointer:

    const QWidget *const p = new QWidget();
    // is equivalent to:
    const QScopedPointer<const QWidget> p(new QWidget());

    QWidget *const p = new QWidget();
    // is equivalent to:
    const QScopedPointer<QWidget> p(new QWidget());

    const QWidget *p = new QWidget();
    // is equivalent to:
    QScopedPointer<const QWidget> p(new QWidget());

Пользовательские обработчики очистки

Массивы, а также указатели, которые были выделены с помощью malloc , не должны удаляться с помощью delete. Второй шаблонный параметр QScopedPointer может быть использован для пользовательских обработчиков очистки.

Существуют следующие пользовательские обработчики очистки:

  • QScopedPointerDeleter — по умолчанию, удаляет указатель, используя delete
  • QScopedPointerArrayDeleter — удаляет указатель, используя delete []. Используйте этот обработчик для указателей, выделенных с помощью new [].
  • QScopedPointerPodDeleter — удаляет указатель, используя free(). Используйте этот обработчик для указателей, выделенных с помощью malloc().
  • QScopedPointerDeleteLater — удаляет указатель, вызывая deleteLater() на нём. Используйте этот обработчик для указателей на QObject, которые активно участвуют в QEventLoop.

Вы можете передавать свои классы в качестве обработчиков, при условии, что у них есть публичная статическая функция void cleanup(T *pointer).

// this QScopedPointer deletes its data using the delete[] operator:
QScopedPointer<int, QScopedPointerArrayDeleter<int> > arrayPointer(new int[42]);

// this QScopedPointer frees its data using free():
QScopedPointer<int, QScopedPointerPodDeleter> podPointer(reinterpret_cast<int *>(malloc(42)));

// this struct calls "myCustomDeallocator" to delete the pointer
struct ScopedPointerCustomDeleter
{
    static inline void cleanup(MyCustomClass *pointer)
    {
        myCustomDeallocator(pointer);
    }
};

// QScopedPointer using a custom deleter:
QScopedPointer<MyCustomClass, ScopedPointerCustomDeleter> customPointer(new MyCustomClass);

Указатели с предварительной декларацией

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

Конкретно это означает, что все классы, содержащие QScopedPointer, указывающий на класс с предварительной декларацией, должны иметь конструкторы, деструкторы и операторы присваивания, отличные от inline:

class MyPrivateClass; // forward declare MyPrivateClass

class MyClass
{
private:
    QScopedPointer<MyPrivateClass> privatePtr; // QScopedPointer to forward declared class

public:
    MyClass(); // OK
    inline ~MyClass() {} // VIOLATION - Destructor must not be inline

private:
    Q_DISABLE_COPY(MyClass) // OK - copy constructor and assignment operators
                             // are now disabled, so the compiler won't implicitely
                             // generate them.
};

В противном случае компилятор выводит предупреждение о невозможности уничтожения MyPrivateClass.

См. также QSharedPointer.

Документация по функциям-членам

QScopedPointer::QScopedPointer(T *p = ...)

Создаёт экземпляр QScopedPointer и устанавливает его указатель на p.

QScopedPointer::~QScopedPointer()

Уничтожает объект QScopedPointer. Удаляет объект, на который указывает его указатель.

T *QScopedPointer::data() const

Возвращает значение указателя, на который ссылается этот объект. QScopedPointer всё ещё владеет объектом, на который указывает.

T *QScopedPointer::get() const

То же, что и data().

Эта функция была введена в Qt 5.11.

bool QScopedPointer::isNull() const

Возвращает true , если этот объект ссылается на nullptr.

void QScopedPointer::reset(T *other = ...)

Удаляет существующий объект (если есть), и устанавливает его указатель на other. QScopedPointer теперь владеет other и удалит его в своём деструкторе.

Чтобы очистить указатель без удаления объекта, на который он указывает (и тем самым взять на себя владение объектом), используйте take() вместо этого.

void QScopedPointer::swap(QScopedPointer<T, Cleanup> &other)

Меняет местами этот указатель с other.

T *QScopedPointer::take()

Возвращает значение указателя, на который ссылается этот объект. Указатель этого объекта QScopedPointer будет сброшен до nullptr.

Вызывающий функцию берёт на себя владение указателем.

bool QScopedPointer::operator bool() const

Возвращает true , если содержащийся указатель не является nullptr . Эта функция подходит для использования в if-constructs, как:

if (scopedPointer) {
    ...
}

См. также isNull().

bool QScopedPointer::operator!() const

Возвращает true , если этот объект ссылается на nullptr.

См. также isNull().

T &QScopedPointer::operator*() const

Предоставляет доступ к объекту управляемого указателя.

Если содержащийся указатель является nullptr , поведение не определено.

См. также isNull().

T *QScopedPointer::operator->() const

Предоставляет доступ к объекту управляемого указателя.

Если содержащийся указатель является nullptr , поведение не определено.

См. также isNull().

END_OF_DOCUMENT_MARKER

Связанные нечлены

bool operator!=(const QScopedPointer<T, Cleanup> &lhs, std::nullptr_t)

Возвращает true если lhs ссылается на допустимый (т.е. не нулевой) указатель.

Эта функция была добавлена в Qt 5.8.

См. также QScopedPointer::isNull().

bool operator!=(std::nullptr_t, const QScopedPointer<T, Cleanup> &rhs)

Возвращает true если rhs ссылается на допустимый (т.е. не нулевой) указатель.

Эта функция была добавлена в Qt 5.8.

См. также QScopedPointer::isNull().

bool operator==(const QScopedPointer<T, Cleanup> &lhs, std::nullptr_t)

Возвращает true если lhs ссылается на nullptr.

Эта функция была добавлена в Qt 5.8.

См. также QScopedPointer::isNull().

bool operator==(std::nullptr_t, const QScopedPointer<T, Cleanup> &rhs)

Возвращает true если rhs ссылается на nullptr.

Эта функция была добавлена в Qt 5.8.

См. также QScopedPointer::isNull().

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.14/qscopedpointer.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API