Dynamic memory means that the memory lifetime isn't managed automatically by the language - like how when you call a function, memory is automatically provided for the various local variables you need.
I think one reason the OP is confused is that this is a confusing explanation. I'd consider things like std::vector to be part of the C++ language (it is part of the standard, even though it is implemented within the language) and it certainly feels more like automatically managed memory than not. In memory-managed languages, such as Java, there is still dynamic memory. Anyway, your second post is much clearer.
In the example provided, the Student object is somewhat of a red-herring. It is using a shared_ptr, which is a tool for handling dynamic memory, but that was an arbitrary choice. It's hard to understand what that shared_ptr is doing there and what it might provide in functionality. It is also being initialized with hard-coded strings, so everything is theoretically known at run-time. A compiler that is super aggressive and awesome at optimizing could replace the program with something that just outputs the correct line.
However, if you imagine a simple change to fill the Student object with information from the console, I think it's more clear what dynamic memory does. The strings within can be of arbitrary size. The memory for them is dynamic regardless of the Student object itself, and they are all automatically freed when the Student goes out of scope. The only limits on those strings are the pointer size, the OS, memory available, etc. - nothing hard-coded into the class. Internally, there must be three arrays for the strings that are allocated dynamically.
On top of that, if you know something about how those objects from the library work, you know there's an array of bytes storing the Student and the reference counter for the shared_ptr, there is a buffer within the ostringstream for building the string, and cin and cout almost certainly use some dynamic memory for handling input and output.
One last note:
The value stored in the pointer returned by Windows (or the Linux kernel)
That number is the address of the RAM cell where the block you just allocated starts.
You're not always getting memory straight from the OS with every "new" call you make. The implementation of the C++ memory manager handles allocating memory within your program, though it may have to allocate memory from the OS if it needs more, and there could be other system calls for making things thread safe, but individual allocations are, in general, the responsibility of the application. How or when it needs a system call to help is up to the memory manager.