In the past whenever I needed to create an instance of a class I would use new to allocate it on the heap (except for stl classes, and math classes like vec3 and mat4).
You allocate on the heap only when you need to dynamically allocate the memory. Meaning you do not know how much you need to allocate at compile time.
You allocate on the stack all other times