Requires: The expression ::new (pv) T(std::forward<Args>(args)...),
where pv has type void* and points to storage suitable
to hold an object of type T, shall be well formed.
Effects: Allocates memory suitable for an object of type T
and constructs an object in that memory via the placement
new-expression::new (pv) T(std::forward<Args>(args)...).
The template allocate_shared uses a copy of a to
allocate memory.
If an exception is thrown, the functions have no effect.