Что такое QSharedPointer в Qt?

«Что такое QSharedPointer в Qt?» — вопрос из категории Qt, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

QSharedPointer — это умный указатель с подсчётом ссылок, предоставляемый фреймворком Qt для автоматического управления временем жизни динамически созданных объектов C++.

Ключевые особенности:

  • Автоматическое удаление: Объект уничтожается, когда последний QSharedPointer, владеющий им, выходит из области видимости или сбрасывается.
  • Потокобезопасность: Атомарный счётчик ссылок делает основные операции (operator=, reset()) безопасными для использования из разных потоков.
  • Кастомные делитеры: Можно задать функцию удаления, например, для использования с массивами (QScopedPointerArrayDeleter) или другими ресурсами.
  • Совместимость с QWeakPointer: Для разрыва циклических ссылок QSharedPointer можно преобразовать в QWeakPointer, который не увеличивает счётчик владения.

Пример использования:

#include <QSharedPointer>
#include <QObject>

// Создание shared pointer'а
QSharedPointer<QObject> objPtr(new QObject());

// Копирование увеличивает счётчик ссылок
QSharedPointer<QObject> anotherPtr = objPtr; // Счётчик = 2

// Сброс одного указателя уменьшает счётчик
anotherPtr.clear(); // Счётчик = 1

// При разрушении objPtr (здесь — при выходе из области видимости)
// счётчик становится 0, и объект QObject удаляется.

Альтернативы в Qt: Для исключительного (единоличного) владения объектом в области видимости используется QScopedPointer. Для наблюдения за объектом, управляемым QSharedPointer, без продления его жизни — QWeakPointer.