我目前正在编写一个分配器,它应该可由 C++ 标准数据结构使用,即它实现 Allocator概念。
分配器非常简单:它分配 x
个对象的 block ,如果当前 block 未满,则始终分配下一个对象,否则分配一个新 block 。
现在我的问题是:当分配器被销毁/复制/move 时如何处理这些 block ?分配器概念没有说明在这些情况下必须发生什么。
这是我的想法:
- 销毁:分配器可能会销毁其所有 block 。但是,使用任何已分配对象的对象都不会比分配器生命周期更长。
- 复制:最直接的想法是复制 block 。但转念一想,这没有任何意义:没有人知道复制 block 中对象的地址,因此它们只是被复制而没有任何好处。也许复制的分配器应该以空的 block 列表开始。
- move : block 应该 move 到新的分配器。旧的应该留下一个空的 block 列表。
我的假设正确吗?如果不是,那么为什么以及在哪里定义的?
最佳答案
分配器通常是可以复制和销毁的轻量级对象,例如在标准容器类中。因此,他们不应该自己进行繁重的内存管理,而应该将其转发给一些更永久的内存管理器对象。如果这样做,内存块的生命周期不取决于分配器生命周期,而是取决于内存管理器对象的生命周期。因此,生命周期思想必须应用于两种类型的对象:
分配器(短生命周期):
- 复制/move :将引用复制到内存管理器。
- 销毁:要么不执行任何操作(内存管理器的外部生命周期管理),要么可能销毁内存管理器,例如每个分配器都有一个指向内存管理器的shared_ptr
内存管理器(长生命周期):
- 应该禁止复制,复制管理器及其托管存储是没有意义的
- 可以允许 move ,但没有多大意义。内存管理器甚至可以是一个类似单例的类,即一个不需要 move 的固定实例。
- 销毁应该涉及托管内存的销毁,因为没有其他对象知道如何释放托管存储。
关于c++ - 当 C++ 分配器被销毁/复制/move 时,它应该如何处理其分配的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26839872/