运行的程序总要与内存进行交互。内存作为操作系统中的重要资源,对他的分配和释放进行管理是一项非常重要的工作。对于某些编程语言,内存管理的工作由开发人员来处理,C和C++语言是这类语言的典型代表。

  一个常见的问题是产生悬挂引用(dangling reference)。悬挂引用指的是对某个对象的应用实际上指向一个错误的内存地址。比如程序中某部分代码引用了另外一部分代码创建的对象,在代码运行过程中,这个被应用的对象被删除,他所占用的内存被释放。随后这部分内存被重新分配给另外的对象使用,而之前的代码可能仍然保持着对原始对象的引用。当代码仍然通过这个旧的引用访问对象的时候,会出现错误,应为这个旧的引用的对象发生了变化。如果这个新的内存被分配给另外的进程,这次访问请求可能会造成程序退出。

  第二个常见的问题是产生内存泄露。造成这个问题的原因是某些对象所占用的内存没有被释放,又没有应用指向这些内存。这样会导致这部分内存对程序来说即不可用又无法被释放,应为在缺乏对象应用的情况下,程序无法对这部分内存进行任何操作。

  对于需要进行显示内存管理的编程语言来说,开发人员需要遵循某些佳实践或利用相关工具来进行正确的内存管理。比如C++中的构造与析构。不管采用任何方式,都对开发人员提出了比较高的要求,也会造成程序中存在很多内存管理相关的潜在问题。

  应为显示内存管理比较容易出现错误,所以不少编程语言采用了自动内存管理机制。自动内存管理的含义是运行平台会提供专门的组件来进行内存的管理工作。这个组件通常被叫做垃圾回收器(garbage collector,GC)。垃圾回收器不仅负责内存的回收,还负责内存的分配。这些编程语言通常也不提供直接API函数来进行内存的分配与管理,内存的分配是隐式进行的。在创建新对象时自动分配所需内存,而对象占有的内存不需要自程序中显示的释放,由垃圾回收器自动处理。Java语言和C#语言是典型的代表,有创建对象的new操作符,但是没有对应的delete操作符。