繁体   English   中英

C ++分配器在销毁/复制/移动时应如何处理其分配的内存?

[英]How should a C++ allocator handle its allocated memory when it is destroyed/copied/moved?

我目前正在编写一个应该由C ++标准数据结构使用的分配器,即,它实现了分配器的概念。

分配器非常简单:它分配x对象的块,如果当前块未满,则始终分发下一个对象,否则分配一个新的块。

现在我的问题是:当分配器被销毁/复制/移动时,如何处理这些块? 分配器概念没有说明在这些情况下必须发生的情况。

这是我的想法:

  • 销毁:分配器可能销毁其所有块。 但是,使用任何已分配对象的对象都不会超过分配器的寿命。
  • 复制:最直接的想法是复制块。 但是,再三考虑,这没有任何意义:没人知道复制的块中对象的地址,因此仅复制它们就没有任何好处。 也许复制的分配器应以空块列表开头。
  • 移动:应该将块移动到新的分配器。 旧的应该留空的块列表。

我的假设正确吗? 如果没有,那么为什么在何处定义?

分配器通常是轻量级的对象,可以在周围复制和销毁,例如在标准容器类中。 因此,他们不应该自己执行繁重的内存管理,而应将其中继给其他一些永久性的内存管理器对象。 如果这样做,则内存块的生存期不取决于分配程序的生存期,而是取决于内存管理器对象的生存期。 因此,一生的想法必须应用于两种类型的对象:

分配器 (寿命短):

  • 复制/移动:将引用复制到内存管理器。
  • 破坏:不执行任何操作(内存管理器的外部生命周期管理)或可能破坏内存管理器,例如,每个分配器都具有与内存管理器的shared_ptr

内存管理器 (使用寿命长):

  • 应该禁止复制,复制管理器及其托管存储是没有意义的
  • 可以允许移动,但意义不大。 内存管理器甚至可以是类单例类,即一个不需要移动的固定实例。
  • 销毁应涉及销毁托管内存,因为没有其他对象知道如何取消分配托管存储。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM