Прочитав буквально десятки ответов здесь, на тему списков, векторов, оператора 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++ - это другой зверь, и я пытаюсь справиться с ним.
Это довольно круто, поэтому элементы тесно связаны с их контейнером. Это все намерение для методов emplace_ *? Будет ли это работать одинаково для списка, где все элементы принадлежат к одному семейству классов, а не только к одному конкретному типу? –
@JCollins Целью методов emplace является создание объекта на сайте, а не его создание в другом месте, а затем его копирование в контейнер. И нет, это не сработает на семействе объектов, для чего вам понадобятся интеллектуальные указатели ('unique_ptr' /' shared_ptr'), которые также обрабатывают время жизни для вас. Вы также можете создать их и выделить для них память без 'new', проверить функции' make_unique'/'make_shared' – imreal
Спасибо imreal, похоже, что это C++ 14, является ли этот стандарт относительно универсальным? –