相同的地址,多个shared_ptr计数器,是C++标准禁止的
Same address, multiple shared_ptr counters, is it forbidden by C++ standard?
假设我需要执行以下操作(这只是一些用于讨论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())) 最终将导致 未定义的行为,尝试删除同一对象两次。—完 注]
实际上,这似乎忘记了您使用自定义删除器的情况。
相关文章:
- 循环在计数器中不起作用
- python集合的C++等价物是什么.计数器
- Python 集合.计数器,如何避免重复查找
- 请解释字谜的代码,我看不懂计数器数组,每个值已经是0
- std::shared_ptr 自定义参考计数器
- 英特尔 TBB 程序不会终止,可能会误用参考计数器
- 不正确的比较和交换计数器输出用于快速排序功能
- OpenSSL API,使用GCM(伽罗瓦计数器模式)进行AES加密
- C++ 在循环中添加计数器变量并再次初始化其值
- 需要帮助才能在C++中创建类计数器
- 漂亮的计数器习语的错误或格式错误的静态订单惨败?
- 几乎总是自动和带计数器的循环
- 线程使用计数器C++
- 为什么使用 2 个嵌套循环 O(n^2) 复杂度来解决二和问题,当只改变循环计数器逻辑时运行得更快?
- 对于循环计数器不递增
- C++输出的就地计数器
- 在两个值之间嵌入C计数器
- 如何在C++中创建 2d 数组,其中一部分包含循环计数器,另一部分包含数字列表?
- 当输出达到某个值时,如何在 c++ 中中断计数器循环
- OpenCV CV 查找单应断言错误计数器 = > 4