Когда ресурс памяти (или распределитель) используется для создания объекта, при удалении необходимо помнить, каким ресурсом памяти он был создан.
Является ли хорошим шаблоном сохранять ресурс памяти в самом объекте и выполнять соответствующее удаление в операторе удаления класса? Следующий код демонстрирует идею:
#include <memory_resource>
using namespace std::pmr;
struct A
{
A (memory_resource * memres_ = nullptr)
: memres(memres_)
{}
memory_resource * memres;
void operator delete(A * this_, std::destroying_delete_t)
{
if ( memory_resource * memres_ = this_->memres )
polymorphic_allocator(memres_).delete_object(this_);
else
::delete(this_);
}
};
int main()
{
A * aGlobal = new A;
delete aGlobal;
memory_resource * memres = get_default_resource();
A * aPmr = polymorphic_allocator(memres).new_object<A>(memres);
delete aPmr;
}