【问题标题】:Why C++ Allocator concept has construct and destroy functionality?为什么 C++ 分配器概念具有构造和销毁功能?
【发布时间】:2017-10-23 17:23:05
【问题描述】:
我认为 Allocator 的唯一任务是分配和释放内存,为什么我不使用某种类型的构造函数和析构函数来初始化和完成呢?
如果我从不实现构造和销毁方法,std::allocator_traits 仍然会使用 T 的构造函数和析构函数来完成工作,我知道 std::allocator 就是这样工作的(C++17),为什么不是所有的 Allocator 都这样工作?
【问题讨论】:
标签:
c++
c++11
memory-management
【解决方案1】:
今天,我知道的construct 和destroy 的主要用例是允许使分配器感知容器分层:也就是说,它将自动为任何嵌套对象使用相同的分配器。这是通过scoped_allocator_adaptor 完成的,这是一个“适应”现有分配器的特殊分配器,它确实定义了construct,以便它传递分配器。这对于您拥有vector<string> 并且您希望所有内部字符串使用与向量相同的分配器的常见情况很有用。这只有在分配器控制构造的情况下才能完成,并且它可以将自己作为额外参数传递给它被要求构造的任何东西。
我会在这里进一步了解它:http://en.cppreference.com/w/cpp/memory/scoped_allocator_adaptor。
理论上,您也可以将其用于仪器;它可能在非生产版本中很有用,但它是一个非常边缘用例(恕我直言)。分配器的用户几乎总是先调用allocate,然后再调用construct,因此单独检测construct 的价值有限。
编辑:我应该说,这是construct 的主要用例。 destroy 只是为了对称。