Placement new is also very useful for writing exception-safe code and reducing the requirements on a type because you can separate memory allocation from object construction.
For example,
new T[size]
allocates memory and default constructs size objects of type T.
operator new(sizeof(T) * size)
Operator new, however, only allocates memory and does not require default construction of type T. You can then use placement new to construct objects in that allocated memory. This is useful because there are many classes that don't offer default construction, which you could not use in the first example.
Be aware that when using placement new you should explicitly call the destructor for any objects you wish to destroy instead of calling delete. Also, if you used operator new to allocate the memory you should use operator delete to free it. E.G.
auto pBlock = operator new(sizeof(T)); // allocate memory for T
new (pBlock) T(value); // construct T in place
auto pT = static_cast<T*>(pBlock); // convert the pointer to something useful
pT->~T(); // destruct T
operator delete(pBlock); // free memory