c++ 两个std::unique_ptr指向同一对象-未定义行为?

fzsnzjdm  于 2022-12-15  发布在  其他
关注(0)|答案(1)|浏览(114)

假设下面的代码:

T* t = new T();
std::unique_ptr<T> p1(t);
std::unique_ptr<T> p2(t);

显然,现在两个std::unique_ptr指向同一个对象。这种状态本身是否已经是未定义的行为?我在标准中找不到适当的提示,所以到目前为止我会回答“否”,但希望得到确认。
旁注:这个问题不是关于后面的双重删除所产生的未定义行为,这可以通过指针release()中的一个在正确的时间删除其内容来避免...

  • 编辑:*
    *从给出的评论和答案来看,这种多所有权是 * 危险的 ,不应该 * 应用于真实的代码中,即使 * 即使 * 未定义的行为实际上可以避免!这个问题只涉及一个思想实验!
fkvaft9z

fkvaft9z1#

从技术上讲,除非你做了一些导致双删除的事情,否则没有UB。std::unique_ptrdoes not state that the pointer should not already be owned,的构造函数,所以在最严格的意义上,指针被两个对象拥有不是未定义的行为
也就是说,代码在语义上是不正确的,不应该这样做。你破坏了std::unique_ptr提供的唯一所有权保证,这意味着你必须非常小心地使用这些对象,以免陷入双重删除的状态。

相关问题