如果分配器在 C++ 中是无状态的,为什么不使用函数来分配内存?

Twi*_*ard 5 c++ allocator

std::allocatorC++ 中的默认类是无状态的。这意味着任何实例都std::allocator可以释放另一个实例分配的内存std::allocator。那么使用分配器实例来分配内存有什么意义呢?

例如,为什么内存分配是这样的:

allocator<T> alloc, alloc2;

T* buffer = alloc.allocate(42); 
alloc2.deallocate(buffer);
Run Code Online (Sandbox Code Playgroud)

当函数可以轻松完成相同的工作时:

T* buffer = allocate(42);
deallocate(buffer);
Run Code Online (Sandbox Code Playgroud)

use*_*522 6

默认分配器是无状态的,但其他分配器可能不是。然而,所有分配器应该共享相同的接口。

您不应该std::allocator像示例中那样直接使用。您可以仅使用newanddelete进行直接分配/释放。

您可以std::allocator间接使用通用的分配器感知类型(例如容器),它们应该不知道它们使用的内存是如何分配的。它们通常有一个满足分配器要求/接口的分配器类型的模板参数,并且std::allocator通常是该模板参数的默认参数。

即使在这些情况下,您也应该通过 来使用分配器std::allocator_traits,而不是直接调用分配器类型的成员函数,因为其中许多都默认通过std::allocator_traits