Какой метод управления памятью мы должны использовать в Qt?

Я довольно новичок в программировании, так как я все еще учусь эффективно кодировать, поэтому мой вопрос может показаться немного странным.

Поскольку я учусь кодировать с помощью Qt, я знаю, что в Qt есть метод управления памятью, при котором родитель удаляет всех своих потомков, когда он сам был удален, и затем QSharedPointer и так много других умных указателей (или вы можете упомянуть boost::shared_ptr).

Я понимаю, как именно работают оба метода, но мой вопрос в том, что, когда речь идет о разработке всей структуры системы в Qt, я должен сделать большую часть своего класса подклассом QObject и передать владение QT для управления памятью или просто используя boost::shared_ptr или же QSharedPointer вещь, чтобы избежать потенциальных утечек памяти?

Так как есть много проблем, чтобы принять во внимание, если мы примем оба метода, потому что это может вызвать проблему двойного удаления.

Так какая техника имеет лучшую производительность или какая лучше в дизайне?

1 ответ

Решение

Как вы знаете, у Qt есть модель, для которой:

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

Более того:

Вы также можете удалить дочерние объекты самостоятельно, и они удалят себя от своих родителей.

Из-за этого, пока вы используете эту модель, у вас не будет проблем двойного освобождения.

Тем не менее, общий подход, который я видел и использовал (но учтите, что когда-либо была причина для этого), состоит в создании двух слоев, первый из которых основывается исключительно на Qt, а второй полностью не знает Qt. Конечно, это требует тонкого слоя, который переводит фрагменты информации туда и обратно.
В такой модели разумно видеть оба применяемых подхода, никогда не смешанные и правильно работающие.

Итак, какой из них лучший? Это зависит от вашей цели.

Я использовал смешанный подход в тех случаях, когда нижележащий уровень был задуман как отдельная кодовая база, поверх которой я мог создавать интерфейс, используя предпочитаемую библиотеку, но также я хотел свободно переключаться на любую библиотеку для пользовательского интерфейса.,
Если это не так, и ваш проект основан исключительно на Qt, нет никаких оснований не основывать все на модели, на которой основан сам Qt.

Другие вопросы по тегам