Shared_ptr 的删除器是否存储在自定义分配器分配的内存中?

2024-04-09

说我有一个shared_ptr使用自定义分配器and自定义删除器。

我在标准中找不到任何有关删除器应存储在何处的内容:它没有说自定义分配器将用于删除器的内存,也没有说它won't be.

这是未指定的还是我只是错过了一些东西?


C++ 11 中的 util.smartptr.shared.const/9:

作用:构造一个shared_ptr对象,该对象拥有对象p和删除器d。第二个和第四个构造函数应使用 a 的副本来分配内存供内部使用。

第二个和第四个构造函数具有以下原型:

template<class Y, class D, class A> shared_ptr(Y* p, D d, A a);
template<class D, class A> shared_ptr(nullptr_t p, D d, A a);

在最新的草案中, util.smartptr.shared.const/10 与我们的目的等效:

作用:构造一个shared_ptr对象,该对象拥有对象p和删除器d。当T不是数组类型时,第一个和第二个构造函数使用p启用shared_from_this。第二个和第四个构造函数应使用 a 的副本来分配内存供内部使用。如果抛出异常,则调用 d(p)。

因此,如果需要在已分配的内存中分配它,则使用分配器。根据现行标准和相关缺陷报告,分配不是强制性的,而是由委员会假设的。

  • 虽然界面shared_ptr允许实现从来没有控制块和所有shared_ptr and weak_ptr放在链表中,实际中没有这样的实现。此外,措辞也已修改,假设use_count是共享的。

  • 删除器只能移动可构造的。因此,不可能在一个文件中拥有多个副本。shared_ptr.

人们可以想象一种将删除器置于专门设计的实现中shared_ptr并在特殊时移动它shared_ptr被删除。虽然实现看起来一致,但它也很奇怪,特别是因为使用计数可能需要控制块(对使用计数做同样的事情也许是可能的,但更奇怪)。

我找到的相关DR:545 http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#545, 575 http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#575, 2434 http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2434(它承认所有实现都使用控制块,并且似乎暗示多线程约束在某种程度上强制它),2802 http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2802(这要求删除器只能移动可构造的,从而阻止在多个删除器之间复制删除器的实现shared_ptr's).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Shared_ptr 的删除器是否存储在自定义分配器分配的内存中? 的相关文章

随机推荐