如何返回指针(和所有权)的向量C ++ 11

时间:2016-08-23 13:02:50

标签: c++ c++11 pointers vector smart-pointers

我有一个工厂方法,它创建一堆对象并返回指向它们的指针。对象的所有权转移给调用者:

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内容。

1 个答案:

答案 0 :(得分:13)

std::vector<std::unique_ptr<animal>>将正常工作:返回函数本地值将移动它,而不是复制它(或仅在移动不可用时)。