【发布时间】:2019-10-07 12:57:20
【问题描述】:
假设如下代码:
T* t = new T();
std::unique_ptr<T> p1(t);
std::unique_ptr<T> p2(t);
显然,现在两个std::unique_ptrs 指向同一个对象。这种状态本身是否已经是未定义的行为?我在标准中找不到合适的提示,所以到目前为止我会回答“不”,但希望得到再次保证。
旁注:这个问题不是关于稍后通过双重删除产生的未定义行为,这可以通过指针release()在正确的时间发送其内容来避免......
【问题讨论】:
-
我不是委员会成员,所以我不能肯定,但draft 表示要求是
unique_ptr必须拥有在构造函数完成后传递给它的指针.因为这将使p1和p2都拥有所有权,所以我会说,是的,这是未定义的行为。 -
是双重免费的UB。这是无法通过我的审查的危险代码。
-
@Jarod42 完全同意危险代码。试验想法仅以获得this problem的解决方案(或者即使
extract是可用,避免一次又一次地重新安排地图),想法会如果已创建副本,则在析构函数中释放智能指针是一个单独的结构......但在我看来,真正的解决方案是,如果 真的 是性能问题,则不在地图中使用智能指针那个案子……
标签: c++ language-lawyer