As Bert says, the "C" programming language is a prolific source of memory leaks. Briefly, it is possible to call a function e.g. alloc (), malloc () or calloc (), to reserve free space memory (also referred to as the "heap"). The reserved memory is not available to the operating system for other purposes, until the owning process releases it or is terminated, or the machine is rebooted.
Assembler is potentially even more dangerous in this respect, but very little Assembler code is written nowadays, and most Assembler programmers were brought up with 64Kb limits on memory, and therefore a Scrooge-like attitude to memory use.
Sloppily written code will often fail to release memory, and keep on grabbing more. Run for long enough, a badly written process (program) will eventually grab enough memory to prevent other processes running, or affect the system speed.
Later programming languages such as "C++" are better in this respect, since they force the programmer to think in "objects", which are supposed to clear up after themselves. Even later languages, like "Java" and "C#" won't usually even allow the programmer to pre-empt memory on the heap.