相同的地址,多个shared_ptr计数器,是否被C ++标准禁止?

时间:2012-06-18 09:07:27

标签: c++ c++11 shared-ptr language-lawyer

假设我需要执行以下操作(这只是用于讨论C ++标准的一些富有想象力的代码,因此我不会讨论为什么我这样设计它,所以不要打扰我:设计是错误的。)

T* ptr = new T;
shared_ptr<T> p(ptr);
shared_ptr<T> q(ptr, SomeDeleterThatDoesnotDeleteButDoSomeOtherStuff());

假设逻辑保证p或其某些副本的寿命比q的所有副本都长,所以实际上不会有任何问题。我的问题是,它是否被C ++标准禁止,例如通过C ++标准明确表示为UB,不同的shared_ptr计数器共享相同的地址?

感谢。

2 个答案:

答案 0 :(得分:5)

如果销毁了第一个shared_ptr对象,那么您将获得UB,因为使用第二个对象的对象可能会访问已发布的对象。

由于你确定你的第一个shared_ptr对象比第二个更长,所以你没有得到UB。

答案 1 :(得分:2)

我无法在标准(最终草案)中找到任何具体规则的内容。我能找到的最近的是20.9.11.2.10 shared_ptr casts

中的注释
  

5 [注:看似相同的表达式   shared_ptr(static_cast(r.get()))最终会导致   未定义的行为,尝试两次删除同一个对象。 -结束   注意]

实际上似乎忘记了自定义删除器的情况。