【问题标题】:c++ vector with strict ownership semantics具有严格所有权语义的 c++ 向量
【发布时间】:2011-08-18 10:00:58
【问题描述】:

不是关于将 std::auto_ptr 放入 std::vector 的问题。

std::std::tr1::boost:: 中是否存在与std::auto_ptr 等效的向量?我在函数参数中使用std::auto_ptr 并返回值来标记这些函数的所有权语义。但这样我只能传递单个对象。作为向量的临时解决方案,我有这个:

std::auto_ptr<std::vector<std::tr1::shared_ptr<ClassExample> > > fx(....);

我想,通过引入 boost,我将能够变成这样:

std::auto_ptr<std::vectro<boost::unique_ptr<ClassExample> > >f(...);

为了定义严格的所有权传递,但似乎相当复杂。为了简化它,我可以使用

std::vector<boost::unique_ptr<ClassExample> > f(...);

因为向量深拷贝的价格不高,但我还是很好奇有没有可以这样使用的东西:

auto_vector<ClassExample> f(...);

表示该函数正在释放所有对象的所有权,并且向量内部数据数组没有被深度复制。

【问题讨论】:

  • 我认为这是“如果每个人都想要一个怎么办”的问题之一。如果auto_vector,那么为什么不auto_dequeauto_setshared_vectorunique_unordered_multiset,基本上是任何智能指针类型与任何类的任何组合。模板语法冗长,typedefs 可以帮助解决这个问题,但这通常是用户的问题。这甚至忽略了您希望 auto_vector&lt;ClassExample&gt; 专门包含 unique_ptr 而不是其他任何内容。
  • 我认为你有一些假设是错误的,特别是大多数编译器将能够优化按值返回而不需要新对象,因此向量本身的动态分配是不必要的复杂性问题。
  • Joe:unique_ptr 在 tr1 中定义在哪里?
  • 你是对的,它只在 C++11 中。 unique_ptr 在 tr1 中没有用,因为它需要 r 值引用才能工作。

标签: c++ memory-management vector


【解决方案1】:

有一个 C++11 解决方案 - 它需要一个提供 r 值引用的实现,并更新了一个标准库以包含移动构造函数和 std::unique_ptr

只需返回 std::vector&lt;std::unique_ptr&lt;T&gt;&gt; - 该类型 无法 被复制,因为 std::unique_ptr&lt;T&gt; 不可复制。编译器将在返回时使用移动构造函数,它不会调用深拷贝,或者将应用 RVO 并省略新对象的构造。

【讨论】:

  • 就此而言,std::vector&lt;T&gt;&amp;&amp; 也可以移动!
  • 推测他正在存储基类指针,或者有其他理由按指针而不是按值存储。
  • 我非常怀疑返回一个引用(可能是一个局部变量)会是一个好主意。 AFAIK,您按值返回,如果复制省略是合法的,那么编译器将选择移动。
  • @UncleBens;你是绝对正确的。我不敢相信我做到了。哎呀。
【解决方案2】:

没有任何特别的理由说明为什么需要维护一个指针向量,第一个解决方案是放弃所有复杂性并追求简单:

std::vector<Type> f();

对象的所有权是唯一的(向量拥有它们),虽然代码看起来在返回时复制了向量,但它将是optimized away in大多数情况。

如果您需要由于某些其他要求动态分配向量内的对象(对象必须通过工厂分配,它们是指向派生类型的指针,或者它们不能移动 由于矢量增长——代码维护引用/指针)你没有显示然后我会去一个boost::ptr_vector 来维护所包含对象的所有权。同样,按值返回:

boost::ptr_vector<Type> f();

【讨论】:

    猜你喜欢
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    相关资源
    最近更新 更多