std::unique_ptr<int> p(new int);
Some people do not have the luxury of using
std::vector, even with allocators. Some people need a dynamically sized array, so
std::array is out. And some people get their arrays from other code that is known to return an array; and that code isn't going to be rewritten to return a
vector or something.
unique_ptr<T>, you service those needs.
In short, you use
unique_ptr<T> when you need to. When the alternatives simply aren't going to work for you. It's a tool of last resort.