Безопасно ли хранить локальный объявленный объект в глобальном QList?

#c #qt #memory-management

#c #qt #управление памятью

Вопрос:

У меня есть CPP-программа, в которой я создаю локальный объект A и хочу сохранить его в глобальном объекте B, который является QList.

Это сохранение для статического выделения объекта A или мне нужно использовать ключевое слово new. Использует ли QList конструктор копирования?

Спасибо

Ответ №1:

QList хранит копии объектов, поэтому он должен работать. Однако убедитесь, что копирование — это действительно то, что вы хотите. Если это не так, выделите свой объект с помощью new и сохраните указатель в QList.

Ответ №2:

Нет. Переменные внутренней области не должны храниться во внешних переменных области. Вы можете сохранить значения, но не ссылку / указатель на эту переменную.

Ответ №3:

QList содержит только указатель на его содержимое. Таким образом, всякий раз, когда вы делаете копию QList, на самом деле копируется не все содержимое, а просто указатель. Всякий раз, когда вы изменяете список, создается копия, чтобы гарантировать, что она не изменяет содержимое других объектов. Смотрите это: http://doc.qt.nokia.com/4.7-snapshot/qshareddatapointer.html

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

Другим решением было бы использовать QSharedDataPointer для создания функциональности, аналогичной функциональности QList.

Обратите внимание, что большинство классов Qt уже используют это, поэтому, если ваш класс содержит перечисленные здесь элементы:http://doc.qt.nokia.com/4.7-snapshot/implicit-sharing.html В использовании QSharedDataPointer нет необходимости.

Я думаю, есть одна вещь, которую вы не прояснили, которая имеет отношение к делу. Вы хотите, чтобы глобальный статический объект A имел те же данные, что и объект в списке?

Этого можно достичь, используя либо указатели, либо QExplicitlySharedDataPointer.

QExplicitlySharedDataPointer во многом такой же, как QSharedDataPointer, за одним исключением. Он не создает копию данных при их изменении. Вот некоторая документация http://doc.qt.nokia.com/4.7-snapshot/qexplicitlyshareddatapointer.html

Я часто использовал эти классы и нашел их очень полезными и совсем не сложными в использовании.

Ответ №4:

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

проверьте эту ссылку для получения подробной информации:

http://twl.pl/jtz/Inne/QT-Tutorial/qlist.html#details

Комментарии:

1. Это сильно устарело. Этот QList полностью отличается от сегодняшнего QList. Это текущий QList в Qt4: doc.qt.nokia.com/latest/qlist.html . QList<A> хранит копии объектов, QList<A *> указатели на объекты. В этом сценарии рекомендуется и безопасно хранить копии там, где это возможно.