An allocation function attempts to allocate the requested amount of
storage
.  If it is successful, it returns the address of the start
of a block of storage whose length in bytes is at least as large
as the requested size
.  The order,
contiguity, and initial value of storage allocated by successive calls
to an allocation function are unspecified
.  Even if the size of the space
requested is zero, the request can fail
.  If the request succeeds, the
value returned by a replaceable allocation function
is a non-null pointer value (
[basic.compound])
p0 different from any previously returned value 
p1,
unless that value 
p1 was subsequently passed to a
replaceable deallocation function
.  Furthermore, for the library allocation functions
in 
[new.delete.single] and 
[new.delete.array],
p0 represents the address of a block of storage disjoint from the storage
for any other object accessible to the caller
.  The effect of indirecting through a pointer
returned from a request for zero size is undefined
.