由 Windows 支持的名为共享内存的 std::allocator(基于MAllocator )的实现向 MAllocator 添加了几个项目。
allocate()的附加参数名称改变了 std::allocator 上的签名。这可以吗,考虑到分配器通常是模板参数(错误将在编译时被捕获)?
template<class T> T *allocate(const size_t n, const char* name);
状态以指向 deallocate() 句柄的指针映射的形式维护。分配器拒绝与其他实例相等以保持状态完整性。这是否足够或是否需要额外的保障措施?
typedef std::map<uintptr_t, HANDLE> HandleMap; HandleMap mHandles; deallocate(T *const p, size_t n = 0) { if (mHandles.find((uintptr_t)p) == mHandles.end()) //we don't own this pointer { std::ostringstream msg; msg << "Error in deallocate(): Invalid pointer - we don't own it - we can't delete it!"; throw std::exception(msg.str().c_str() ); } unmapView(p); closeHandle(p); mHandles.erase((uintptr_t)p); }
github上的完整代码