Чтобы расширить на ответ Neox , в Qt есть два метода управления объектами:
- QObject древовидная структура
- Классы управляемых указателей
И эти два не очень хорошо смешиваются по причинам, которые станут очевидными.
QObject s может быть «свободным» или иметь родителя. Когда QObject имеет свой родительский набор (либо предоставив конструктору QObject указатель на другой QObject, либо вызвав setParent()
), родительский QObject становится владельцем дочернего QObject и будет гарантировать, что любой из его дочерних элементов будет уничтожен, когда он является. Есть также несколько методов, доступных для проверки отношений ребенка / родителя.
Отдельным методом управления динамически размещаемыми объектами являются классы управляемых указателей, которые эта статья объясняет довольно хорошо. Подводя итог, хотя:
- «Класс QScopedPointer хранит указатель на динамически размещенный объект и удаляет его при уничтожении» и поэтому хорош, когда вам нужны объекты, которые имеют явное и очевидное владение и срок службы.
- «Класс QSharedPointer содержит строгую ссылку на общий указатель [и] удалит указатель, который он держит, когда он выходит из области видимости, при условии, что другие объекты QSharedPointer не ссылаются на него», и поэтому хорошо, когда владение не так очевидно, но вы хотите, чтобы оно не потерялось и не стало утечкой памяти. QWeakPointer может использоваться для совместного использования указателя без каких-либо прав собственности.
Как вы можете видеть, некоторые классы защищенного указателя могут использоваться с деревом QObject, но вы должны убедиться, что вы тщательно прочитали и поняли документацию, прежде чем сделать это, иначе вы можете получить поврежденную структуру данных.