【问题标题】:std::unique_ptr usagestd::unique_ptr 用法
【发布时间】:2011-04-11 14:27:22
【问题描述】:
std::unique_ptr<int> p1(new int);
std::unique_ptr<int> p2(new int);
p2=p1;

这里 p1 似乎不再是“唯一的”,因为 p2 也引用它

这是合法的 c++ 吗? unique_ptr 有 copy_semantics 吗? 如果不是,并且如果它只有移动语义,那么在将 p1 分配给 p2 之后是否将其设置为 NULL ?

编辑:

好的,所以正确的版本是

 p2=std::move(p1)

据此,在此分配之后,p1 无效?和 auto_ptr 的区别就在这里?明确地指定所有权转移比隐式地指定所有权转移更安全,因为我猜 auto_ptr 就是这种情况

【问题讨论】:

  • @Andres:作为在各种 C++ 编译器中发现数十个错误的人,我认为这根本不是真的,尤其是涉及到相对较新(且相对未经测试)的语言特性时右值引用。
  • @James 这个虽然有效。 :)
  • 您可以查看here 了解 unique_ptr 的典型用法
  • p1 在 'p2 = std::move(p1);' 之后持有一个空指针

标签: c++ c++11 unique-ptr


【解决方案1】:

std::unique_ptr 是不可赋值和不可复制的。你需要使用 std::move();

所以

p1 = std::move(p2);

查看here 了解更多信息。

【讨论】:

  • 链接已损坏。
  • 链接失效,无法访问
【解决方案2】:

这是我写的一篇文章,它回答了你的问题。我最初写这篇文章是为了展示对 unique_ptr 的模拟。不过,您可以忽略前几段处理仿真的内容,直接从“基本示例”开始阅读。

http://howardhinnant.github.io/unique_ptr03.html

编辑:

我无法将上面链接的文章提炼成小到足以以这种格式给出实际答案的内容。然而,这是我最好的选择:

原因:通用代码的安全性。 一个不能真正复制的 auto_ptrunique_ptr。 考虑:

template <class T>
void foo(T t)
{
    T copy_of_t = t;  // line 4
    assert(copy_of_t == t);
}

泛型一点也不稀奇 代码看起来像上面的foo。这 assert 实际上可能不是 那里,但假设 assert 会经常持有... 隐式。事实上,std::sort 的流行实现已经 1996 年正是这个逻辑,即 究竟是什么促使了第二个 auto_ptr 重新设计(有帮助,但是 没有完全解决问题)。

【讨论】:

  • 感谢您的文章 :) 总结链接的内容被认为是 SO 的良好做法,这样即使链接失效,答案也不会失去其价值。
【解决方案3】:

根据thisp2=p1 是编译错误。

【讨论】:

    猜你喜欢
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 2020-04-17
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多