Almost all modern programming languages allocate memory
in two places: on the stack and on the heap. Memory allocated on the
stack stores local variables, parameters, and return values, and is
generally managed automatically by the operating system. Memory
allocated on the heap, however, is treated differently by different
languages. In C and C++, memory allocated on the heap is managed
manually. In C# and Java, however, memory allocated on the heap is
While manual memory management has the advantage of being simple for
runtimes to implement, it has drawbacks that tend not to exist in
systems that offer automatic memory management. For example, a large
percentage of bugs in C and C++ programs stem from using an object
after it has been deleted (dangling pointers) or forgetting to delete
an object when it is no longer needed (memory leaks).
The process of automatically managing memory is known as garbage
collection. While generally more complex for runtimes to implement
than traditional manual memory management, garbage collection greatly
simplifies development and eliminates many common errors related to
manual memory management.
For example, it is almost impossible to generate a traditional memory
leak in C#, and common bugs such as circular references in
traditional COM development simply go away.