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

Same address, multiple shared_ptr counters, is it forbidden by C++ standard?

本文关键字:计数器 C++ 标准 禁止 ptr shared 地址 多个      更新时间:2023-10-16

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

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

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

谢谢。

如果第一个shared_ptr对象被销毁,则得到UB,因为使用第二个的对象可能会访问已发布的对象。

由于您确保第一个shared_ptr对象的生存时间比第二个对象的生存时间更长,因此不会获得 UB。

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

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

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