You need to allocate memory from the heap if:
- Your object is too big
- You're gonna allocate a bunch of objects
- You're gonna make a large array
- You just don't have enough space for the stack (A stack is just a few megabytes per app)
You have to allocate from the heap if you should, but you don't have to manually call new and delete everytime you allocate from the heap. That's why smart pointers exist.