Web Analytics
yangyang

码农兼一个普普通通小青年

All Posts in 2013.4


.NET中实现正确的资源释放模式

在工作中,经常会碰到诸如内存泄漏的问题,有时候会听到同事讨论在.NET中如何释放内存,比如说“不要使用using,要手动调用dispose”,“要手动的编写析构函数”等等,其中很多观点我觉得不对,今天稍微整理一下,本文译自Effective C#。 一 问题的由来     在.NET这种托管环境中,垃圾回收为我们管理内存,和其他一些语言如C++不同,我们不必操心内存泄漏,非法指针,没有实例化的指针,以及其他一些内存管理的问题。但是垃圾回收也不是万能的。在有些时候,我们也必须自己手动的对使用过的资源进行清理。对一些非托管的资源,如文件句柄、数据库连接、GDI+对象,COM对象以及其他一些系统级别的对象进行访问后,我们需要进行手动的清理。另外,有时候可能会使得某些对象在内存中的存留时间比我们预期的要长,比如在我们创建事件或者代理的时候。一些查询表达式,因为有延迟执行的特性,会使得一些对象的生存 …

IDisposable

.NET中使用P/Invoke 导致内存已损坏异常的一则解决方法

一 问题重现 前面在减少.NET内存占用的一则实践中,和大家分享了在.NET中使用P/Invoke技术来调用C++编写的非托管代码的例子。虽然性能和内存占用还不错,但是在随后而来的几周里,在某些同事的机器上总是偶尔会出现异常导致应用程序突然崩溃,尤其是在一些配置比较好的机器上。于是完善了一下日志记录,捕捉到最多的异常是: “Attempted to read or write protected memory. This is often an indication that other memory is corrupt.” 然后调试的时候无法跟进去,直接抛出如下的异常: 根据这个异常实在查找不出任何有意义的信息,不过结合这两者很明显的知道,问题出在调用的非托管的代码里面。 二 解决方法 根据之前提示的问题, …

Memory Corrupted .NET Performance Optimizing