Класс QScopedPointer
Класс QScopedPointer хранит указатель на динамически выделенный объект и удаляет его при уничтожении. Подробнее...
| Заголовок: | #include <QScopedPointer> |
| qmake: | QT += core |
| С момента: | Qt 4.6 |
| Наследуется от: |
Примечание: Все функции в этом классе являются перевходовыми.
Открытые функции
| QScopedPointer(T *p = Q_NULLPTR) | |
| ~QScopedPointer() | |
| T * | data() const |
| bool | isNull() const |
| void | reset(T *other = Q_NULLPTR) |
| void | swap(QScopedPointer<T, Cleanup> &other) |
| T * | take() |
| 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 хранит указатель на динамически выделенный объект и удаляет его при уничтожении.
Управление объектами, выделенными на куче, вручную сложно и подвержено ошибкам, что часто приводит к утечке памяти и трудностям в обслуживании. 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;
} Она усложняется ручными вызовами 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, указывающий на класс, объявленный вперед, должны иметь конструкторы, деструкторы и операторы присваивания, не являющиеся встроенными:
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 = Q_NULLPTR)
Создаёт этот экземпляр QScopedPointer и устанавливает его указатель на p.
QScopedPointer::~QScopedPointer()
Уничтожает этот объект QScopedPointer. Удаляет объект, на который указывает его указатель.
T *QScopedPointer::data() const
Возвращает значение указателя, на который ссылается этот объект. QScopedPointer по-прежнему владеет объектом, на который указывает указатель.
bool QScopedPointer::isNull() const
Возвращает true если этот объект держит указатель, который null.
void QScopedPointer::reset(T *other = Q_NULLPTR)
Удаляет существующий объект, на который он указывает, если таковой имеется, и устанавливает свой указатель на other. QScopedPointer теперь владеет other и удалит его в своём деструкторе.
void QScopedPointer::swap(QScopedPointer<T, Cleanup> &other)
Меняет местами этот указатель с other.
T *QScopedPointer::take()
Возвращает значение указателя, на который ссылается этот объект. Указатель этого объекта QScopedPointer будет сброшен до null.
Вызывающие функции берут на себя владение указателем.
QScopedPointer::operator bool() const
Возвращает true если этот объект не null. Эта функция подходит для использования в if-constructs, например:
if (scopedPointer) {
...
} См. также isNull().
bool QScopedPointer::operator!() const
Возвращает true если указатель, на который ссылается этот объект, null, в противном случае возвращает false.
См. также isNull().
T &QScopedPointer::operator*() const
Обеспечивает доступ к объекту, на который указывает указатель.
Если содержащийся указатель null, поведение неопределено.
См. также isNull().
T *QScopedPointer::operator->() const
Обеспечивает доступ к объекту, на который указывает указатель.
Если содержащийся указатель null, поведение неопределено.
См. также isNull().
Связанные не члены
bool operator!=(const QScopedPointer<T, Cleanup> &lhs, std::nullptr_t)
Возвращает true если указатель scoped lhs является допустимым (т.е. не нулевым) указателем.
Эта функция была добавлена в Qt 5.8.
См. также QScopedPointer::isNull().
bool operator!=(std::nullptr_t, const QScopedPointer<T, Cleanup> &rhs)
Возвращает true если указатель scoped rhs является допустимым (т.е. не нулевым) указателем.
Эта функция была добавлена в Qt 5.8.
См. также QScopedPointer::isNull().
bool operator==(const QScopedPointer<T, Cleanup> &lhs, std::nullptr_t)
Возвращает true если указатель scoped lhs является нулевым указателем.
Эта функция была добавлена в Qt 5.8.
См. также QScopedPointer::isNull().
bool operator==(std::nullptr_t, const QScopedPointer<T, Cleanup> &rhs)
Возвращает true если указатель scoped rhs является нулевым указателем.
Эта функция была добавлена в 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.9/qscopedpointer.html