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
被删除。虽然实现看起来一致,但它也很奇怪,特别是因为使用计数可能需要控制块(对使用计数做同样的事情也许是可能的,但更奇怪)。
我找到的相关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).