std::allocator ( MAllocatorに基づく)の実装は、共有メモリという名前の Windows によってサポートされ、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の完全なコード