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

Kan*_* Li 6 c++ shared-ptr language-lawyer c++11

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

T* ptr = new T;
shared_ptr<T> p(ptr);
shared_ptr<T> q(ptr, SomeDeleterThatDoesnotDeleteButDoSomeOtherStuff());
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

BЈо*_*вић 5

如果第一个shared_ptr对象被销毁,那么您将获得UB,因为使用第二个对象的对象可能会访问已释放的对象.

既然你确定你的第一个shared_ptr对象比第二个更长,你就不会得到UB.


BoB*_*ish 2

我在标准(好吧,最终草案)中找不到任何具体排除它的内容。我能找到的最接近的是注释20.9.11.2.10 shared_ptr casts

\n\n
\n

5 [ 注意:看似等效的表达式shared_ptr(static_cast(r.get())) 最终将导致未定义的行为,尝试两次删除同一对象。\xe2\x80\x94end\n 注意]

\n
\n\n

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

\n