代码之家  ›  专栏  ›  技术社区  ›  Roel

std::auto_ptr的惯用用法还是只使用共享_ptr?

  •  19
  • Roel  · 技术社区  · 16 年前

    既然 shared_ptr 在TR1中,您认为使用 std::auto_ptr ?它们都有不同的用例,但是 auto_ptr 可以用 SelddPPTR 也是。你会放弃吗 自动PTR 或者在您希望明确表示在任何给定点只有一个类拥有所有权的情况下继续使用它?

    我的看法是用 自动PTR 可以通过添加细微差别和代码设计的指示来提高代码的清晰度,但另一方面,在培训新程序员时,它又增加了另一个微妙的问题:他们需要了解智能指针以及如何工作的细节。当您在任何地方只使用一个智能指针时,您可以设置一个规则“将所有指针都包装在 SelddPPTR “把它做完。

    你对这个有什么看法?

    5 回复  |  直到 13 年前
        1
  •  13
  •   Community CDub    8 年前

    为“避免”提供更多弹药 std::auto_ptr 营地: auto_ptr 在下一个标准(C++0x)中被弃用。我认为仅此一点就足以让任何争论使用其他东西。

    然而,作为 Konrad Rudolph 提到,默认替换为 自动PTR 应该是 boost::scoped_ptr . 的语义 scoped_ptr 更接近于 自动PTR 它也用于类似用途。下一个C++ 09标准将有类似的称为UnQuyJ-PTR的东西。

    然而,使用 shared_ptr 任何地方 范围范围 应该使用不会破坏任何东西,如果对象实际上永远不会被共享,它只会增加一点效率低下的处理引用计数。所以对于永远不会分发给另一个对象的私有成员指针-使用 范围范围 . 如果指针将被分发给其他对象(这包括在容器中使用它们,或者如果您只想转移所有权而不保留或共享它),请使用 SelddPPTR .

        2
  •  28
  •   MSalters    14 年前

    自动签名也不错。当一个函数 auto_ptr<T> 它的价值意味着它将消耗 T . 如果函数返回 自动指针 很明显,它放弃了所有权。这可以传达你一生的意图。

    另一方面,使用 scoped_ptr<T> 意味着你不想关心 T .这也意味着你可以在更多的地方使用它。这两个智能指针都是有效的选择,您当然可以在一个程序中同时使用这两个指针。

        3
  •  11
  •   Anthony Williams    16 年前

    使用 shared_ptr “无处不在”是一个很好的默认规则,当然也是教人们如何负责任地使用智能指针的一个很好的起点。然而,这并不总是最好的选择。

    如果你不需要共享所有权, SelddPPTR 是过度杀戮:它必须为引用计数分配一个单独的内存块,这会影响性能,而且文档方面也不那么清晰。

    我个人用 std::auto_ptr 在很多地方 boost::scoped_ptr 也就足够了:例如,在所有权转移到其他地方之前持有一个堆分配的对象,在那里干预操作可能会抛出。

    C++0X将有 std::unique_ptr 补足 std::shared_ptr 作为更好的替代方案 STD:AutoTypTR . 当它变得广泛可用时,我将开始使用它。

        4
  •  5
  •   Konrad Rudolph    16 年前

    我认为最好的做法是用 std::auto_ptr 通过 boost::scoped_ptr 除非 std::tr1::shared_ptr 更好地满足要求, 如果 你不介意使用Boost。另一方面,这肯定是有意的 scoped_ptr 不包括在TR1中。

        5
  •  3
  •   C. K. Young    16 年前

    我相信“把所有的指针都包起来 shared_ptr “确实应该是默认模式,并且是向初级编码人员提供的合适建议。但是,在您提到的特殊所有权案例中, auto_ptr 确实更合适,在这种情况下应鼓励使用。

    推荐文章