【问题标题】:How to return vector of pointers (and ownership) C++11如何返回指针向量(和所有权)C++11
【发布时间】:2016-12-30 07:59: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&lt;animal&gt; 也可能适用于您的目的。动物对象将与向量一起分配,并在移动操作后随其移动。

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


【解决方案1】:

std::vector&lt;std::unique_ptr&lt;animal&gt;&gt; 可以正常工作:返回函数局部值将移动它,而不是复制它(或仅当移动不可用时)。

【讨论】:

  • Hmm.. 这不是意味着我的代码依赖于编译器执行“返回值优化”的能力吗?我知道所有相关的编译器都实现了它,但我不确定它们是否真的保证在所有情况下都执行它。这是标准做法吗?
  • @Stefan 不,那不是 RVO。 RVO 将完全删除函数本地,并使用调用方的那个来代替它。这是关于 return 移动构造临时返回的对象(如果 RVO 事先失败)。
  • 这就是我所缺少的! Python 6 年后重回 C++。我觉得生锈和被宠坏了。打算阅读这个“移动”的东西。谢谢!
  • @Quentin 从技术上讲,它将(或可以)消除本地功能,而不是删除它。 (省略是在某些(标准描述的)情况下合并对象标识的标准允许过程。所有对象都存在,但现在它们的名称(如果有的话)都引用同一个对象总寿命。)
  • @Stefan 另外,在 C++17 中会有一种叫做“保证复制省略”的东西,我相信,即使没有移动或复制构造函数,它本质上也会强制执行类似 RVO 的行为。
猜你喜欢
  • 1970-01-01
  • 2019-03-25
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 2010-10-13
  • 2015-10-06
  • 1970-01-01
  • 2016-12-28
相关资源
最近更新 更多