Да, вы можете это сделать, но убедитесь, что вы понимаете, что происходит. Цель уничтожителя - уничтожить объект. Распределитель используется для внутренних бухгалтерских структур.
std::shared_ptr<T> sp(new T(args...), std::default_delete<T>(), myalloc);
Точка make_shared
и allocate_shared
является то, что они заботиться о создании объекта для вас, так что вы не указали Deleter — они используют свой собственный Deleter, который подходит для пути они получили ресурсы (т.е. соответственно через operator new
и предоставленный распределитель).
Вы, конечно, можете создать свой собственный распределитель Deleter (как this one или один proposed here), чтобы перейти в вышеприведенном конструктор, чтобы идти вместе с распределителем распределённой объекта, а затем использовать аллокатор (или другой!) для бухгалтерского учета.
Есть что сказать, что не используется make_shared
/allocate_shared
в ситуациях, когда у вас есть долгоживущие слабые указатели или где размер двоичных объектов имеет значение.