能否使用自定义分配器分配任意大小内存?chunk指针空间如何分配释放
正确实现方案
要实现所有内存分配都走传入的Allocator,只需要使用std::allocator_traits提供的分配器重绑定机制即可,具体修改逻辑如下:
核心原理
你当前传入的分配器默认适配的是容器存储的T类型,而你要分配的chunks数组存储的是T*类型的指针,因此需要把原分配器重绑定到T*类型,拿到适配指针类型的分配器实例再做内存操作。
具体修改代码
首先在CustomContainer类内部补充重绑定分配器的类型定义,再替换原有new/delete逻辑:
template<class T, class Allocator = std::allocator<T>> class CustomContainer{ // 新增:重绑定适配T*类型的分配器与特性类 using PtrAllocator = typename std::allocator_traits<Allocator>::template rebind_alloc<T*>; using PtrAllocTraits = typename std::allocator_traits<Allocator>::template rebind_traits<T*>; public: // 原有成员方法保持不变.. private: void createNewChunk() { // 原有逻辑保持不变... // 替换原来的new T*[CHUNK_SIZE] PtrAllocator ptr_alloc(allocator); newChunkAddr = PtrAllocTraits::allocate(ptr_alloc, CHUNK_SIZE); } void destroyChunk(T* chunkAddr) { // 原有逻辑保持不变... // 替换原来的delete [] chunkAddr PtrAllocator ptr_alloc(allocator); PtrAllocTraits::deallocate(ptr_alloc, chunkAddr, CHUNK_SIZE); } private: /*** Members ***/ // 原有成员保持不变 ... std::size_t size = 0; T** chunks = nullptr; Allocator allocator; };
额外说明
- 因为
T*是平凡类型,分配的内存只需要存储指针值,不需要调用构造/析构函数,因此不需要使用construct/destroy方法,仅调用allocate/deallocate即可满足要求。 - 重绑定机制是C++标准库为分配器设计的原生能力,所有符合标准规范的自定义分配器都支持该操作,完全满足你"所有动态资源分配都通过传入的Allocator完成"的需求。
内容的提问来源于stack exchange,提问作者Caglayan Dokme
相关产品推荐
相关产品推荐

