Я добавляю пользовательские распределители памяти в систему и пытаюсь сделать это правильно с помощью концепции Allocator
, но я столкнулся с некоторой неопределенностью при достижении точки, где тип выделенного компонента был стерта.
class Pimpl_interface {
public:
virtual ~Pimpl_interface() {}
virtual void foo() = 0;
};
template<typename T>
class Pimpl : public Pimpl_interface {
public:
void foo() override {}
};
template<typename Alloc = std::allocator<void>>
class MyType : public Alloc {
Pimpl_interface * pimpl_ = nullptr;
public:
MyType(const Alloc& alloc) : Alloc(alloc) {}
~MyType() {
if(pimpl_) {
pimpl_->~Pimpl_interface();
// What do I put here ?????
}
}
template<typename T>
void bar() {
using real_alloc_t = typename Alloc::template rebind<Pimpl<T>>::other;
real_alloc_t alloc(*static_cast<Alloc*>(this));
Pimpl<T>* ptr = alloc.allocate(1);
try {
pimpl_ = new(&ptr) Pimpl<T>();
}
catch(...) {
alloc.deallocate(ptr, 1);
throw;
}
}
};
На первый взгляд кажется, что нужно сделать перепривязку Alloc
к Pimpl_interface
и надеяться, что это правильно. Я знаю, что это будет нормально работать с std::allocator
, но должно ли это то, что пользовательские распределители должны поддерживать для всех типов перебираемых распределителей?
В худшем случае я могу вместо этого взять объект-распределитель типа 1010 *, подобный утке, но я бы лучше попытался следовать стандартной библиотеке, если смогу.