我有一个工厂方法,它创建了一堆对象并返回指向它们的指针。这些对象的所有权会转移到调用方:
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++实现返回多个对象所有权的好方法。目前避免使用boost库,我正在尝试探索新的C++11内容。
std::vector<animal>
也可以满足您的需求。动物对象将与向量一起分配并在移动操作后移动。 - Erik Uggeldahl