int *p = new int;
This allocates enough memory for a single object of type int and stores a pointer to it in the pointer-to-int variable p. This means that *p refers to a valid int object.
int *p = new int[10];
This allocates enough contiguous memory for ten objects of type int and stores a pointer to the first int in the pointer-to-int variable p. This means that p[0] through p[9] refer to valid int objects.
int *p = new int[];
This statement is syntactically incorrect. It is not valid C++, and therefore has no meaning.
... why is it required to specifically mention pointer array size?
How else is the memory allocator supposed to know how much memory to allocate if you don't tell it how many ints you need room for?