我有一个工厂方法,它创建一堆对象并返回指向它们的指针。对象的所有权转移给调用者:
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内容。
答案 0 :(得分:13)
std::vector<std::unique_ptr<animal>>
将正常工作:返回函数本地值将移动它,而不是复制它(或仅在移动不可用时)。