假设下面的代码:
T* t = new T();
std::unique_ptr<T> p1(t);
std::unique_ptr<T> p2(t);
显然,现在两个std::unique_ptr
指向同一个对象。这种状态本身是否已经是未定义的行为?我在标准中找不到适当的提示,所以到目前为止我会回答“否”,但希望得到确认。
旁注:这个问题不是关于后面的双重删除所产生的未定义行为,这可以通过指针release()
中的一个在正确的时间删除其内容来避免...
- 编辑:*
*从给出的评论和答案来看,这种多所有权是 * 危险的 ,不应该 * 应用于真实的代码中,即使 * 即使 * 未定义的行为实际上可以避免!这个问题只涉及一个思想实验!
1条答案
按热度按时间fkvaft9z1#
从技术上讲,除非你做了一些导致双删除的事情,否则没有UB。
std::unique_ptr
does not state that the pointer should not already be owned,的构造函数,所以在最严格的意义上,指针被两个对象拥有不是未定义的行为也就是说,代码在语义上是不正确的,不应该这样做。你破坏了
std::unique_ptr
提供的唯一所有权保证,这意味着你必须非常小心地使用这些对象,以免陷入双重删除的状态。