c++ - 如何正确使用C++ 11风格的内存池?

标签 c++ c++11 memory-management smart-pointers memory-pool

我正在尝试设计一个简单的嵌入式应用程序的内部机制。大量数据到达网络,需要将其传送到由寻址机制确定的组件。多个组件可以订阅同一地址。我想设计一种体系结构,其中将传入的块封装到从内存池分配的包装对象中。每个组件都可以根据需要保留包装程序(以及其中的数据),并且在所有组件放开包装时应将其释放。那时,它已返回池中,并再次准备好分配。池的排空不是问题。

我计划使用满足Allocator的this内存池实现。为了自动销毁包装器对象,我计划使用std::shared_ptr,以便当所有组件都释放包装器时,它将自动销毁并将使用的内存返回到池中。

我看不到这两个概念如何结合在一起。如果我直接从池中分配内存(通过调用allocate()),它将给我一个指向数据块的指针,这很好,但是如何自动调用deallocate()呢?还是我需要对包装对象使用另一个容器(如std::list)并将其传递给内存池分配器?

最佳答案

您可以将std::shared_ptr与使用 std::allocate_shared 的自定义分配器一起使用。无论如何,这可能都是您想要的,因为我假设您也希望使用池分配器来分配控制块(即引用计数)。

使用std::allocate_shared构造对象时,分配器的副本存储在shared_ptr内部,因此在销毁时将调用正确的deallocate()

请注意,您还可以使用自定义删除器创建std::shared_ptr,例如:

auto allocator = getAllocator<Foo>();
auto ptr = std::shared_ptr<Foo>(new(allocator.allocate()) Foo,
  [&allocator](auto * ptr) { allocator.deallocate(ptr); });

但是,正如我提到的那样,这可能不是您想要的,因为不会使用分配器对象分配用于引用计数的空间。

顺便说一句,如果您仍然在“购物”,这是另一个我非常喜欢的内存池实现:foonathan::memory。它提供了自己的allocate_shared

关于c++ - 如何正确使用C++ 11风格的内存池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60497378/

相关文章:

c++ - 取消引用指针以获取值或创建本地对象并以这种方式访问​​值更好吗?

c++ - OpenMP 虚假共享

C++ 11 vector 构造函数复制与范围?

c++ - C++ 中的双重否定

c++ - 使用递归进行质因数分解

PHP数组效率和内存澄清

r - 什么时候在 RStudio 中将数据存储在内存之外变得有益?

c++ - 在线判断平台中的全局数组堆内存分配

c++ - RTTI 和异常之间有关系吗?

C++:如何设置函数返回值的精度?