如何正确使用C ++ 11样式的内存池?

问题描述 投票:1回答:1

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

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

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

c++ c++11 memory-management smart-pointers memory-pool
1个回答
0
投票

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

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

如果您仍然在“货比三家”,这是另一个我非常喜欢的内存池实现:deallocate()。它提供了自己的foonathan::memory

© www.soinside.com 2019 - 2024. All rights reserved.