Вы не можете передать владение, потому что распределитель может быть скопирован и восстановлен несколько раз, даже в одном контейнере, и полученные экземпляры используются одновременно.
Вместо этого вам придется поделиться ресурсом. Создайте косвенное указание для ресурса со счетчиком ссылок. Что-то вроде:
class SharedHandle {
HANDLE h_;
int count;
SharedHandle(HANDLE h) : h_(h), count(1) {}
~SharedHandle() { CloseHandle(h_); } // or whatever to release the resource.
SharedHandle *Ref() { ++count; return this; }
void Unref() { if(!--count) delete this; }
}
и чем:
explicit MyAllocator( const MyAllocator< U >& other ) throw()
: h_( other.h_->Ref() )
В дополнение к контейнерам, которые, естественно, должны выделять гетерогенные блоки, такие как hash_map
/ unordered_map
, известно, что реализация контейнеров Microsoft выделяет различные странные вещи. Когда я отслеживал выделения в одном приложении Windows, из STL исходило много распределений странных размеров.