c++ - 当 C++ 分配器被销毁/复制/move 时,它应该如何处理其分配的内存?

标签 c++ memory memory-management move allocator

我目前正在编写一个分配器,它应该可由 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/

相关文章:

c++ - 多线程应用程序概念

c++ - 使用和重载基类的模板成员函数?

c++ - while循环在C++中不循环

c++ - 我如何使用 C++ 创建 AVAHI 客户端和服务器?

c++ - Windows上的大型连续虚拟内存分配

ios - 在循环中重复分配 NSString 同时避免内存泄漏

python - Numpy 数组大于 RAM : write to disk or out-of-core solution?

memory-management - 监控 Spark 作业的内存使用情况

C++ 动态内存细节

c++ - 实时音频,快速循环中的临时缓冲区,不同的方法