demystifying memory management in modern programming languages