memory is allocated in one of 2 places, the heap or the stack.
regular declarations go on the stack and they are destroyed when the next "}" is hit, described as "going out of scope"
if you want some thing to "hang around" then the heap is a better option, it will stay until you deallocate it.
you may also want to use the heap if the data you are declaring is too big to go on the stack.
vs2015 has a default stack size of 1mb for the entire program, which is plenty for most folk.
if you had something bigger, say int data[2*1024*1024]; you would have to use the heap for it, so it would have to be new'd. (if thats a real word)
Memory allocation is mostly used when you don't know at compile time how many items will be used. For example, if you prompt the user for a name, you don't know how many characters will be in it. Or if you numbers from a file, you don't know how many numbers will be in it. In both of these cases the program must allocate memory as needed.
While allocating memory is easy, deallocating it is notoriously easy to screw up. For this reason the standard library contains many of the structures that would cause you to allocate memory in the first place (string, list, vector etc). Also, use unique_ptr or shared_ptr if possible too.
malloc, calloc, realloc, free new, delete, new[] and delete[] all do slightly different things. It may be worth learning them, but your first choice should be the facilities in the standard library that I mentioned.