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

标签 c++ c++11 memory-management unique-ptr allocator

我正在尝试使用 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/

相关文章:

c++ - 将 char 数组转换为 uint8_t

c++ - OpenCV 与 std::vector 不兼容? (_crtIsValidHeapPointer 错误)

c++ - 如何读取 C++ 中的 JSON 内容?

c++11 - 带有 std::function 参数的函数不接受 lambda 函数

c++ - 如何使用 std::chrono::duration 作为模板参数?

iphone - 如何创建本地自动释放池以节省内存?

c - 解释为什么在 C 中分配大数组会导致段错误

java - 使用静态变量节省数组空间

c++ - 在 OSX 上从 C++ 打开 PDF

c++ - GCC 4.4 fails to link valid C++11 code, when options are -std=C++0x -O0