In standard C++, declaring arrays with zero elements is illegal:
int n; //illegal
However, certain compilers do support arrays of zero size as non-standard extension.
In contrast, dynamic allocation of zero sized arrays is valid C++:
int n = new int;
The standard requires that in this case, new allocate an array with no elements. The pointer returned by new is non-null and it is distinct from a pointer to any other object. Similarly, deleting such a pointer is a legal operation.
While zero-sized dynamic arrays may seem like another C++ trivia that no one may ever need, this feature is chiefly important when implementing custom memory allocators: A custom allocation function may take any non-negative (i.e., unsigned) argument without worrying whether it's zero.
void * allocate_mem(unsigned int size)
//...no need to check whether size equals zero
return new char[size];