我正在尝试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 )
由于底层内存可能来自预分配的块,因此我需要特殊的...Array()
-methods来分配和释放数组,它们分配/释放内存并在范围中的每个元素上调用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 ) );
基本上必须将数组的大小手动传递到deleter对象。有一个更好的方法吗?这对我来说似乎很容易出错...
是的,最肯定有更好的方法:
使用制造商功能。
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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句