2015-08-15 3 views
2

Прочитав буквально десятки ответов здесь, на тему списков, векторов, оператора new, RAII и this очень хорошее описание распределения памяти, я до сих пор не могу представьте себе практическую реализацию, которая отвечает следующей необходимости. Примечание. Я наиболее опытен в .net и его управлении памятью, если это помогает направлять любые ответы.Как добавить новые экземпляры объектов в std :: list без 'new'

В принципе, у меня есть класс (скажем class RecordFile {}), который инкапсулирует текстовый файл в определенном формате. Каждая строка соответствует записи, которую я хотел бы добавить к std::list<Record>, принадлежащей экземпляру RecordList, где class Record захватывает данные из одной строки в файле.

В RecordList классе, у меня есть метод RecordList::Read(), который считывает файл строку за строкой, создавая новый экземпляр Record и добавить его в список принадлежащего экземпляром RecordList.

Этот метод Read() представляет собой цикл, который выполняет итерацию по линиям файла, создавая новые экземпляры Record. Ясно, что как только файл будет прочитан, а метод Read() закончит, я хотел бы, чтобы список записей сохранялся в объекте RecordList, но я не вижу, как это сделать, не используя «новый» оператор.

Как эта задача должна выполняться в C++ без нарушения того, что кажется фундаментальным? В .net это было бы тривиально и выполнялось точно так же, как сказано без риска для производительности или утечки памяти. Я понимаю, что C++ - это другой зверь, и я пытаюсь справиться с ним.

ответ

4

Контейнер list позаботится об управлении памятью для вас.

Просто создайте list элемент на вашем RecordList класса, как это:

std::list<Record> records_; 

Затем просто добавить строки с помощью emplace_back:

records_.emplace_back(<whatever parameters `Record` constructor takes>); 

Когда RecordList разрушается, так это list и все ее элементы ,

+0

Это довольно круто, поэтому элементы тесно связаны с их контейнером. Это все намерение для методов emplace_ *? Будет ли это работать одинаково для списка, где все элементы принадлежат к одному семейству классов, а не только к одному конкретному типу? –

+0

@JCollins Целью методов emplace является создание объекта на сайте, а не его создание в другом месте, а затем его копирование в контейнер. И нет, это не сработает на семействе объектов, для чего вам понадобятся интеллектуальные указатели ('unique_ptr' /' shared_ptr'), которые также обрабатывают время жизни для вас. Вы также можете создать их и выделить для них память без 'new', проверить функции' make_unique'/'make_shared' – imreal

+0

Спасибо imreal, похоже, что это C++ 14, является ли этот стандарт относительно универсальным? –

Смежные вопросы