I read everywhere that in C++ it is not possible to get the size of a dynamic array just from the pointer pointing to that chunk of memory.
How is it possible that there is no way of getting the size of a dynamic array just from the pointer, and at the same time it is possible to free all the memory allocated by using
delete  just on the pointer, without the need of specifying the array size?
delete  must know the size of the array, right? Therefore this information must exist somewhere. Shouldn't it?
What is wrong in my reasoning?
It does - the allocator, or some implementation detail behind it, knows exactly what the size of the block is.
But that information is not provided to you or to the "code layer" of your program.
Could the language have been designed to do this? Sure! It's probably a case of "don't pay for what you don't use" — it's your responsibility to remember this information. After all, you know how much memory you asked for! Often times people will not want the cost of a number being passed up the call stack when, most of the time, they won't need it to be.
There are some platform-specific "extensions" that may get you what you want, like
malloc_usable_size on Linux and
_msize on Windows, though these assume that your allocator used
malloc and didn't do any other magic that may extend the size of the allocated block at the lowest level. I'd say you're still better off tracking this yourself if you really need it… or using a vector.