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