繁体   English   中英

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

[英]std::unique_ptr<T[]> and custom allocator deleter

我试图使用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()方法来分配和释放数组,它们分配/释放内存并在每个元素上调用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);

T*不包含这样的信息,unique_ptr也不知道数组的大小(因为它直接使用了你所说的delete [] )。 您可以让T成为unique_ptr<T>来自动管理销毁,但如果整个连续的T*由内存分配器(而不是单个T*对象)管理,则无法实现。 例如:

unique_ptr<unique_ptr<Foo>[]> data;
data.reset(new unique_ptr<Foo>[50]);
data[0].reset(new Foo());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM