QList
- это контейнерный класс ... это означает, что он управляет памятью, поэтому вам не нужно об этом беспокоиться. Базовая структура данных представляет собой вариант deque с некоторыми специальными изменениями , поэтому ваше понимание индексации в списке неверно. Но так или иначе, это детали, которые абстрагируются от интерфейса, и вам не нужно беспокоиться о них. Вы просто используете данные методы класса, такие как operator[]
или at()
, чтобы получить ссылку на объект по заданному индексу, и другие функции, такие как push_back()
или insert()
, чтобы копировать объекты в контейнер. Таким образом, вы можете просто создать экземпляр QList
в стеке (при условии, что он не выйдет из области видимости, пока он необходим) и скопировать в него объекты. Базовая структура данных будет правильно распределять память, необходимую для динамического хранения объектов, и во время уничтожения объекта QList
она освобождает память, используемую для хранения объектов, которыми она «владеет».
Думайте о QList
так же, как если бы вы думали о контейнере STL, таком как std::vector
или std::list
... опять же, базовая структура данных для QList
не совпадает с этими контейнерами STL, но суть заключается в том, что вы можете разместить структуру данных в стеке так же, как и в любом другом классе, и он содержит все частные члены-данные и информацию, необходимую для управления памятью в куче. Выделение QList
в куче с помощью вызова new
ничего вам не даст в этом отношении ... уже есть указатели и т. Д. Внутри структуры данных, для вас выделение и управление памятью содержащихся объектов .
Наконец, не беспокойтесь о фрагментации данных. Смысл хорошего контейнерного класса в том, чтобы правильно распределить память, чтобы избежать проблем фрагментации памяти из-за слишком частого выделения и перераспределения памяти. Кроме того, выделение памяти занимает много времени, поэтому если класс контейнера постоянно должен вызывать new
, это действительно ухудшит его производительность. Хотя выделение памяти для каждой вставки может быть необходимостью для контейнеров на основе узлов, таких как связанные списки и деревья, хеш-таблицы, динамические массивы и другие структуры данных блочного типа гораздо более эффективны при использовании памяти, которую они выделяют, чтобы минимизировать эти вызовы распределения.