Управление памятью для коллекций виджетов в Qt - PullRequest
5 голосов
/ 03 марта 2010

Извините за глупый вопрос, но я впервые работаю с Qt и C ++ и прорабатываю учебник и некоторые примеры.

Одна вещь, которая была упомянута, заключалась в том, что материал Qt не нужно явно удалять. Итак, основной вопрос , это также относится к коллекциям Qt? Например, я хочу, чтобы динамическое число составляло MyWidget с, поэтому я сохраняю vector или любое другое из них. Они все еще заботятся обо мне?

Как побочный вопрос, что происходит, чтобы мне не приходилось беспокоиться о деструкторах?

Ответы [ 2 ]

7 голосов
/ 03 марта 2010

Модель управления памятью Qt основана на отношениях родитель-потомок. Классы Qt принимают необязательный parent в качестве параметра своего конструктора. Новый экземпляр регистрируется с этим родителем, так что он удаляется при удалении родителя. Если вы используете коллекцию Qt (например, QList), я считаю, что вы можете установить список в качестве родительского для его записей. Если вы используете std :: vector или другой тип коллекции, вы не получите «автоматического» управления памятью.

Модель Qt имеет большой смысл в иерархии пользовательского интерфейса, где она соответствует один к одному с иерархией пользовательского интерфейса. В других случаях он не всегда отображается так же чисто, и вам нужно оценить, имеет ли смысл использование системы Qt для конкретной ситуации. Обычные инструменты C ++ по-прежнему работают: вы можете использовать std :: tr1 :: shared_ptr или любой другой класс умных указателей, чтобы помочь вам управлять временем жизни объекта. Qt также включает в себя QPointer, защищенный указатель и пару QSharedPointer / QWeakPointer, которые реализуют умный указатель и пару слабых ссылок.

5 голосов
/ 04 марта 2010

Qt наверняка имеет интересную объектную модель. Когда я только начинал, меня беспокоило, что было так много new Foo вызовов, а не delete с.

http://qt.nokia.com/doc/4.6/object.html Хорошее место для начала чтения объектной модели.

Вещи, представляющие интерес: Подклассы QObject имеют свои методы присваивания и копирования-ctor отключенными. Цепочка объектов child-parent поддерживается внутри QObject.

Обычно при создании экземпляра подкласса QObject (если вы не планируете управлять его указателем самостоятельно), вы предоставляете другой указатель QObject в качестве родителя. Этот «родитель» затем берет на себя управление ребенком, которого вы только что сделали. Вы можете вызвать setParent () для объекта QObject, чтобы изменить того, кто «владеет» им. В Qt очень мало методов, которые изменят родительский объект, и все они явно заявляют, что они делают в документах.

Итак, чтобы ответить на ваш конкретный вопрос: это зависит от того, как вы создали все свои экземпляры MyWidget.

Если вы сделали каждый с родителем, то нет, вам не нужно их удалять. Родитель удалит их при удалении.

Если вы храните коллекцию из них QList<MyWidget*>, и вы не дали им родителя, вы должны удалить их самостоятельно.

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