У меня есть метод фабрики, который создает кучу объектов и возвращает указатели на них. Право собственности на объекты переходит к абоненту:Как вернуть вектор указателей (и собственности) C++ 11
std::vector<animal*> create_zoo();
Это работает, но подвержено утечке памяти.
auto zoo = create_zoo();
Вектор находится в стеке и автоматически очищается, а содержащиеся объекты - нет.
Объекты различных подтипов возвращаются. Сохранять значения вместо указателей не будет.
Я думал использовать
std::vector<std::unique_ptr<animal> > create_zoo();
но unique_ptr
не копировать семантику и я возвращаю vector
по значению, которое, теоретически, создает копию.
я мог бы поставить vector
на кучу, чтобы избежать этого
std::unique_ptr<std::vector<std::unique_ptr<animal> > > create_zoo();
, но это становится смешно.
Это должно работать также:
std::vector<std::shared_ptr<animal> > create_zoo();
Это будет работать, но это на самом деле не передавать право собственности. Вызывающий должен предположить, что могут быть другие указатели на объекты.
Я открыт для предложений. не обязательно должно быть std::vector
. Я просто ищу хороший способ реализации фабрики, которая возвращает право собственности на несколько объектов с современным C++. На данный момент я избегаю повышения. Я пытаюсь изучить новый материал C++ 11.
Вы также можете пересмотреть, нужны ли вам объекты животных, которые будут выделены в качестве указателей. 'std :: vector' также может работать для ваших целей. Объекты животных будут выделены вектором и будут перемещаться вместе с ним после операций перемещения. –