假设我需要执行以下操作(这只是用于讨论C ++标准的一些富有想象力的代码,因此我不会讨论为什么我这样设计它,所以不要打扰我:设计是错误的。)
T* ptr = new T;
shared_ptr<T> p(ptr);
shared_ptr<T> q(ptr, SomeDeleterThatDoesnotDeleteButDoSomeOtherStuff());
假设逻辑保证p
或其某些副本的寿命比q
的所有副本都长,所以实际上不会有任何问题。我的问题是,它是否被C ++标准禁止,例如通过C ++标准明确表示为UB,不同的shared_ptr计数器共享相同的地址?
感谢。
答案 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()))最终会导致 未定义的行为,尝试两次删除同一个对象。 -结束 注意]
实际上似乎忘记了自定义删除器的情况。