Разница между QSharedPointer и QSharedDataPointer?
В чем разница между этими двумя типами указателей? Насколько я могу прочитать, QSharedPointer может хорошо справиться с ситуацией, так зачем же нужен QSharedDataPointer?
1 ответ
Из документации Qt QSharedDataPointer
Класс QSharedDataPointer представляет указатель на неявно разделяемый объект. QSharedDataPointer облегчает написание ваших собственных неявно разделяемых классов. QSharedDataPointer реализует поточно-ориентированный подсчет ссылок, гарантируя, что добавление QSharedDataPointers в ваши повторно входящие классы не сделает их не входящими. Неявное совместное использование используется многими классами Qt для объединения скорости и эффективности использования памяти указателями с простотой использования классов. Смотрите страницу Shared Classes для получения дополнительной информации.
Пример использования -
#include <QSharedData>
#include <QString>
class EmployeeData : public QSharedData
{
public:
EmployeeData() : id(-1) { }
EmployeeData(const EmployeeData &other)
: QSharedData(other), id(other.id), name(other.name) { }
~EmployeeData() { }
Для QSharedPointer
Класс QSharedPointer содержит строгую ссылку на общий указатель. QSharedPointer - это автоматический общий указатель в C++. Он ведет себя точно так же, как обычный указатель для обычных целей, включая уважение к константности. QSharedPointer удалит указатель, который он удерживает, когда он выходит из области видимости, при условии, что другие объекты QSharedPointer не ссылаются на него.
> QSharedPointer<MyObject> obj =
> QSharedPointer<MyObject>(new MyObject);
Итак, QSharedDataPointer используется для создания неявно разделяемых классов. Принимая во внимание, что QSharedPointer является интеллектуальным указателем подсчета ссылок, который указывает на классы.
РЕДАКТИРОВАТЬ
При чтении управления памятью в Qt? Я нашел эту ссылку http://blog.qt.io/blog/2009/08/25/count-with-me-how-many-smart-pointer-classes-does-qt-have/. Действительно отличное обсуждение различных умных указателей в Qt (в текущем API их 8).