我正在尝试使用 std::unique_ptr<T[]>
使用自定义内存分配器。基本上,我有自定义分配器,它们是 IAllocator
的子类,它提供了以下方法:
void* Alloc( size_t size )
template<typename T> T* AllocArray( size_t count )
void Free( void* mem )
template<typename T> void FreeArray( T* arr, size_t count )
由于底层内存可能来自预分配 block ,因此我需要特殊的 ...Array()
- 分配和释放数组的方法,它们分配/释放内存并调用 T()
/~T()
在范围内的每个元素上。
现在,据我所知,std::unique_ptr
的自定义删除器|使用签名:
void operator()(T* ptr) const
在unique_ptr<T[]>
的情况下, 通常你会调用 delete[]
并完成它,但我必须调用FreeArray<T>
,为此我需要范围内的元素数量。仅给出原始指针,我认为没有办法获得范围的大小,因此我唯一能想到的是:
std::unique_ptr<T[], MyArrDeleter> somePtr( allocator.AllocArray<T>( 20 ), MyArrDeleter( allocator, 20 ) );
本质上,数组的大小必须手动传递到删除器对象中。有一个更好的方法吗?这对我来说似乎很容易出错......
最佳答案
是的,肯定有更好的方法:
使用制造商功能。
template<class T, class A> std::unique_ptr<T[], MyArrDeleter>
my_maker(size_t count, A&& allocator) {
return {somePtr(allocator.AllocArray<T>(count), MyArrDeleter(allocator, count)};
}
auto p = my_maker<T>(42, allocator);
关于c++ - std::unique_ptr<T[]> 和自定义分配器删除器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28413035/