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)
默认分配器是无状态的,但其他分配器可能不是。然而,所有分配器应该共享相同的接口。
您不应该std::allocator像示例中那样直接使用。您可以仅使用newanddelete进行直接分配/释放。
您可以std::allocator间接使用通用的分配器感知类型(例如容器),它们应该不知道它们使用的内存是如何分配的。它们通常有一个满足分配器要求/接口的分配器类型的模板参数,并且std::allocator通常是该模板参数的默认参数。
即使在这些情况下,您也应该通过 来使用分配器std::allocator_traits,而不是直接调用分配器类型的成员函数,因为其中许多都默认通过std::allocator_traits。