代码之家  ›  专栏  ›  技术社区  ›  Loki Astari

标准::自动\u ptr到标准::唯一\u ptr

  •  175
  • Loki Astari  · 技术社区  · 14 年前

    随着新标准的到来(以及一些编译器中已有的部分),新类型 std::unique_ptr 应该是一个替代品 std::auto_ptr .

    它们的用法是否完全重叠(这样我就可以在我的代码上进行全局查找/替换(不是说我会这样做,而是如果我这样做了)),或者我是否应该意识到从阅读文档中看不出的一些差异?

    另外,如果它是一个直接的替代品,为什么要给它一个新的名字,而不是仅仅改善它的性能 ?

    4 回复  |  直到 6 年前
        1
  •  225
  •   Klaim    14 年前

    无法执行全局查找/替换,因为可以复制 auto_ptr (已知后果),但 unique_ptr 只能移动。任何看起来像

    std::auto_ptr<int> p(new int);
    std::auto_ptr<int> p2 = p; 
    

    std::unique_ptr<int> p(new int);
    std::unique_ptr<int> p2 = std::move(p);
    

    至于其他区别, delete[] ,而 自动\u ptr 将尝试呼叫 delete .

        2
  •  95
  •   deft_code    11 年前

    std::auto_ptr std::unique_ptr std::move .

    • 函数范围变量:
      100%兼容,只要不通过值传递给另一个函数。

    • 不是100%兼容,但99%兼容似乎没有错。
    • 按值列出的函数参数:
      100%兼容一个警告, unique_ptr 必须通过 打电话。这一个很简单,因为如果你没有弄对,编译器会抱怨。
    • 参照功能参数:
    • 类成员变量:
      这个很棘手。 标准::自动检查 复制语义是邪恶的。如果类不允许复制,那么 是一个临时替代品。但是,如果您试图为类提供合理的复制语义,则需要更改 标准::自动检查 标准::自动检查 成员 没有

    标准::唯一\u ptr 是一个完整的 标准::自动检查 . 它不允许在编译时 使用时出错 标准::自动检查 . 所以如果你用 带着它所需要的关怀,切换到 标准::唯一\u ptr 应该很简单。如果你依靠 标准::自动检查

        3
  •  37
  •   UncleBens    14 年前

    阿法伊克, unique_ptr 不是直接的替代品。它修复的主要缺陷是所有权的隐性转移。

    std::auto_ptr<int> a(new int(10)), b;
    b = a; //implicitly transfers ownership
    
    std::unique_ptr<int> a(new int(10)), b;
    b = std::move(a); //ownership must be transferred explicitly
    

    另一方面, 将有全新的功能:它们可以存储在容器中。

        4
  •  33
  •   ValarDohaeris    10 年前

    赫伯·萨特对这个问题有很好的解释 GotW #89 :

    AutoTypTR最有魅力地被认为是在C++之前创建一个UNIQuYGPTR的英勇尝试。 有移动语义。auto\u ptr现在已被弃用,不应使用 在新代码中。

    如果您在现有的代码库中有auto\ptr,当您有机会 尝试进行全局搜索并将auto\u ptr替换为unique\u ptr;这个 绝大多数的用法都是一样的,它可能会暴露(作为一个 编译时错误)或修复(静默)一两个你不认识的错误 有。

    换句话说,虽然全局搜索和替换可能会暂时“破坏”您的代码,但您还是应该这样做:修复编译错误可能需要一些时间,但从长远来看,会为您节省更多的麻烦。

    推荐文章