2016-08-23 68 views
11

我有一个工厂方法,可以创建一堆对象并返回指向它们的指针。对象的所有权转移给来电者:如何返回指针(和所有权)的向量C++ 11

std::vector<animal*> create_zoo(); 

这可行,但容易发生内存泄漏。

auto zoo = create_zoo(); 

该向量位于堆栈上并自动清除,包含的对象不是。

返回各种子类型的对象。 Returing值而不是指针不会。

我想用

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

您还可以重新考虑是否需要将动物对象分配为指针。 'std :: vector '也可以用于你的目的。移动操作后,动物物体将被分配矢量并随其移动。 –

回答

13

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

+0

嗯..这并不意味着我的代码依赖于编译器执行“返回值优化”的能力吗?我知道所有相关的编译器都已经实现了,但我不确定他们是否确实保证在所有情况下都能执行它。这是标准做法吗? – Stefan

+6

@Stefan no,那不是RVO。 RVO将完全删除本地功能,并将其用于呼叫方的位置。这是关于'return'移动 - 构建临时返回对象(如果RVO事先未通过)。 – Quentin

+2

这就是我错过的那一点!经过6年的Python后返回到C++。我感到生锈和被宠坏。去读这个“移动”的东西。谢谢! – Stefan