std :: unique_ptr <T []>和自定义分配器删除器

Mortano

我正在尝试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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

具有std :: function的std :: shared_ptr作为自定义删除器和分配器

std :: unique_ptr <T>而不在堆上分配内存

使用带有分配器的std :: unique_ptr

将std :: vector <std :: unique_ptr <T >>分配给另一个std :: vector <std :: unique_ptr <T >>

std :: unique_ptr,自定义删除器和类型更改

使用std :: unique_ptr <T>&代替std :: unique_ptr <T>有什么优势吗?

使用std :: function对象将自定义删除器传递给std :: unique_ptr

无法使用带有std :: move的自定义删除器插入std :: unique_ptr

是否需要std :: unique_ptr <T>知道T的完整定义?

参数std :: unique_ptr <T> &&的std :: move或std :: forward

为什么std :: unique_ptr不能隐式转换为T *和const T *?

is_assignable和std :: unique_ptr

std :: unique_ptr和QObject :: deleteLater

如何初始化std :: unique_ptr <std :: unique_ptr <T> []>?

std :: unique_ptr <T []>具有派生对象的数组,使用已删除的函数

使用typedef为std :: unique_ptr指定自定义默认删除器

未调用std :: unique_ptr中的自定义删除器

std :: unique_ptr使用带有很少参数的自定义删除器

如何在C ++ 11中返回包含自定义删除器的std :: unique_ptr?

调整大小std :: vector <std :: unique_ptr <T >>的性能

使用 std::unique_ptr<T>::unique_ptr` 在 Visual Studio 2013 中构建错误

为什么std :: shared_ptr <T> = std :: unique_ptr <T []>可以编译,而std :: shared_ptr <T []> = std :: unique_ptr <T []>不可以编译?

在gcc 6中实现std :: unique_ptr <T []> :: reset

std :: unique_ptr和std :: ostringstream(SIGSEGV)的奇怪行为

如何安全地重载std :: unique_ptr的自定义删除程序?

带有lambda自定义删除程序的std :: unique_ptr无法编译

为什么unique_ptr <T> ::〜unique_ptr需要定义T?

使用 std::move 分配 unique_ptr 不起作用

我可以使用自定义删除器简洁地声明std :: unique_ptr吗?