std::unique_ptr<object> p = std::unique_ptr<object>(new object);
This is fine, but you could simplify this like so:
std::unique_ptr<object> p { new object{} };
Or like this in C++14:
auto p = std::make_unique<object>();
You don't need to delete a std::unique_ptr, that's the whole point. When p goes out of scope (at the end of main), the pointee will be deleted automatically.
That said, there's no need to use dynamic allocation in this example. You should just use an automatic variable instead:
int main(){ object p{}; p.say(); }
A good rule of thumb is to use automatic storage duration when you can and dynamic storage duration when you must.
std::make_unique has the advantage of protecting against leaks in situations like this:
process(std::unique_ptr<object>(new object), iMightThrow());
If new object is executed first, then iMightThrow runs and throws, memory will be leaked. std::make_unique guards against this:
process(std::make_unique<object>(), iMightThrow());
Now if iMightThrow() throws, the std::unique_ptr will either not have been created, or it will be destroyed and reclaim the memory.