Динамическое выделение памяти в QT - PullRequest
3 голосов
/ 03 февраля 2012

Как разрушаются динамически размещенные указатели в кодировании QT, потому что мы не пишем для них определенный деструктор?

Ответы [ 2 ]

8 голосов
/ 03 февраля 2012

Чтобы расширить на ответ Neox , в Qt есть два метода управления объектами:

  1. QObject древовидная структура
  2. Классы управляемых указателей

И эти два не очень хорошо смешиваются по причинам, которые станут очевидными.

QObject s может быть «свободным» или иметь родителя. Когда QObject имеет свой родительский набор (либо предоставив конструктору QObject указатель на другой QObject, либо вызвав setParent()), родительский QObject становится владельцем дочернего QObject и будет гарантировать, что любой из его дочерних элементов будет уничтожен, когда он является. Есть также несколько методов, доступных для проверки отношений ребенка / родителя.

Отдельным методом управления динамически размещаемыми объектами являются классы управляемых указателей, которые эта статья объясняет довольно хорошо. Подводя итог, хотя:

  • «Класс QScopedPointer хранит указатель на динамически размещенный объект и удаляет его при уничтожении» и поэтому хорош, когда вам нужны объекты, которые имеют явное и очевидное владение и срок службы.
  • «Класс QSharedPointer содержит строгую ссылку на общий указатель [и] удалит указатель, который он держит, когда он выходит из области видимости, при условии, что другие объекты QSharedPointer не ссылаются на него», и поэтому хорошо, когда владение не так очевидно, но вы хотите, чтобы оно не потерялось и не стало утечкой памяти. QWeakPointer может использоваться для совместного использования указателя без каких-либо прав собственности.

Как вы можете видеть, некоторые классы защищенного указателя могут использоваться с деревом QObject, но вы должны убедиться, что вы тщательно прочитали и поняли документацию, прежде чем сделать это, иначе вы можете получить поврежденную структуру данных.

3 голосов
/ 03 февраля 2012

Краткий ответ:

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

Qt имеет хороший документ об иерархии объектов и владении в рамках. Вы можете прочитать это здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...