Ik ben geen C++-expert aangezien ik er nog maar een drietal maanden mee bezig ben, maar ik zal zal proberen.
In Java bijvoorbeeld komen objecten automatisch op de heap terecht, en primitieven op de stack. In C++ kan je kiezen waar je die dingen plaatst. Wat de stack en de heap precies zijn, kan iemand anders beter uitleggen, ik schets gewoon even de gevolgen.
int MyValue = 5; creëert een integer op de stack. De plaats in het geheugen waar de variabele MyValue mee overeenkomt, bevat effectief de, laten we zeggen 32, bits van een integer. Een gevolg van het declareren van een variabele op de stack is dat het geheugen (die 32 bits) automatisch vrijgegeven worden als de scope van de variabele eindigt (in de meeste gevallen is dat op het einde van een method).
int* pMyValue = new int(5); creëert een integer op de heap. De plaats in het geheugen waar pMyValue mee overeenkomt, bevat een pointer naar de 32 bits van de integer. In tegenstelling tot een integer op de stack, wordt het geheugen van de integer niet vrijgegeven op het einde van de method. Het geheugen van de pointer wel, maar die is dan ook op de stack gecreëerd.
Het voordeel van dingen creëren op de heap? Ze leven langer. Het nadeel: je moet ze zelf opruimen met delete.
In sommige gevallen ben je trouwens genoodzaakt om je toevlucht te zoeken tot de heap: wanneer je polymorfisme toepast kan er een fenomeen optreden dat slicing heet, maar daar ga ik je niet mee lastigvallen.