开发人员在内存管理方面的背景

更新:2007 年 11 月

根据您开发背景的不同,您在内存管理方面的经验也会有所不同。在某些情况下,您可能需要让您的编程习惯来适应公共语言运行库提供的自动内存管理。

COM 开发人员

COM 开发人员习惯于将实现引用计数作为一个手动的内存管理技术。每次引用一个对象,计数器就递增。如果对对象的引用超出了范围,计数器就递减。当对象的引用计数达到零时,对象被终止并释放其内存。

引用计数方案会引发许多调试 bug。如果未能严格地按照引用计数的规则进行操作,对象可能被过早释放或者未引用的对象积存在内存中。循环引用也是常见的 bug 根源。循环引用出现在子对象引用父对象,而父对象又引用子对象时。这种情况使两个对象都不能被释放或销毁。唯一的解决方案就是让父对象和子对象都遵守一个固定的使用和销毁模式,例如总是先由父对象删除子对象。

当使用面向公共语言运行库的语言开发应用程序时,运行库的垃圾回收器不用对引用进行计数,因此也就避免了由这种手动管理内存方案引发的 bug。

C++ 开发人员

C++ 开发人员熟悉与手动内存管理相关的任务。在 C++ 中,当您使用 new 运算符为对象分配内存时,您必须使用 delete 运算符释放对象的内存。这可能导致多种错误,例如忘记释放对象、引起内存泄漏或试图访问已被释放的对象的内存。

使用 Visual C++ 或面向公共语言运行库的其他语言开发应用程序时,不必使用 delete 运算符即可释放对象。垃圾回收器在当对象不再被应用程序使用时自动为您完成这些操作。

考虑到手动管理短期对象内存的相关成本,C++ 开发人员可能习惯于避免使用这些对象。对于两次回收间创建的然后又不再使用的托管短期对象,分配和释放内存的成本非常低。在 .NET Framework 中,实际上已经对垃圾回收器进行了优化来管理具有较短生存期的对象。当开发托管应用程序时,在短期对象可以简化代码的情况下使用它们是非常合适的。

Visual Basic 开发人员

Visual Basic 开发人员习惯于自动内存管理。您熟悉的编程惯例将应用于您在 .NET Framework 中创建的大多数托管对象。但是,当创建或使用封装非托管资源的对象时,您应该特别注意使用 Dispose 方法的推荐设计模式。

.NET Framework 支持的面向公共语言运行库的语言要比在此介绍的语言多。不管您使用哪一种托管语言,.NET Framework 的垃圾回收器都提供自动内存管理。它为托管对象分配和释放内存,并在必要时执行 Finalize 方法和析构函数来适当地清理非托管资源。自动内存管理通过消除手动内存管理方案引起的常见 bug 简化了开发。

请参见

概念

Finalize 方法和析构函数

其他资源

垃圾回收