本当にshared_ptrごと格納する必要があるの?
これで良かったりはしない?

shared_ptr<Hoge> p(new(buffer) Hoge, [](Hoge* p){p->~Hoge();});