gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:29:37 29 4
gpt4 key购买 nike

假设我有一个带有自定义分配器和自定义删除器的 shared_ptr

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

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

最佳答案

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

Effects: Constructs a shared_ptr object that owns the object p and the deleter d. The second and fourth constructors shall use a copy of a to allocate memory for internal use.

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

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 与我们的目的等效:

Effects: Constructs a shared_­ptr object that owns the object p and the deleter d. When T is not an array type, the first and second constructors enable shared_­from_­this with p. The second and fourth constructors shall use a copy of a to allocate memory for internal use. If an exception is thrown, d(p) is called.

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

  • 尽管 shared_ptr 的接口(interface)允许实现永远不存在控制 block 并且所有 shared_ptrweak_ptr 都放入链表,实际中没有这样的实现。此外,假设 use_count 是共享的,措辞也进行了修改。

  • 删除器只能移动可构造的。因此,shared_ptr 中不可能有多个拷贝。

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

我找到的相关DR:545 , 575 , 2434 (它承认所有实现都使用控制 block ,并且似乎暗示多线程约束在某种程度上强制它),2802 (这要求删除器只能移动可构造的,从而阻止在多个 shared_ptr 之间复制删除器的实现)。

关于c++ - Shared_ptr 的删除器是否存储在自定义分配器分配的内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58932991/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com