6

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

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

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

谢谢。

4

2 回答 2

5

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

由于您确保第一个 shared_ptr 对象的寿命比第二个长,因此您不会获得 UB。

于 2012-06-18T09:11:59.773 回答
2

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

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

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

于 2012-06-18T09:37:06.100 回答