博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#内存泄漏的事例
阅读量:6233 次
发布时间:2019-06-21

本文共 2649 字,大约阅读时间需要 8 分钟。

C#内存泄漏的事例

  一,使用非托管资源忘记及时Dispose

    (1)  使用完非托管资源一定要Dispose或者使用using

using (FileStream fsWrite = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write))            {                string str = "我好像不能全部覆盖源文件中的数据";                byte[] buffer = Encoding.Default.GetBytes(str);                fsWrite.Write(buffer,0,buffer.Length);//无返回值,以字节数组的形式写入数据            }
       string path =@"C:\Users\fighting  man\Desktop\FileStream的使用\vs快捷键.txt" ;            FileStream fsRead = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Read);            //三个参数(参数1读取文件的路径,参数2对文件的做什么样的操作,参数3对文件中的数据做什么样的操作)            //FileStream 用来操作字节(不是一次性读取对内存压力小适合读大文件)            try            {                //创建FileStream类的对象(路径,对文件的操作,对文本文件数据的操作)                byte[] buffer = new byte[1024 * 1024 * 1];                int r = fsRead.Read(buffer, 0, buffer.Length);//把数据读到字节数组中,返回实际读到的有效字节数                string str = Encoding.Default.GetString(buffer, 0, r);//解码到实际读到的字节数            }            finally            {                fsRead.Close();//关闭流                fsRead.Dispose();//释放流            }

              非托管资源还包括OracleConnection,套接字,com对象,操作excel对象等,使用完毕一定要手动Dispose。

          (2)定义的自定义类里使用了非托管资源,需要继承接口IDisposable,实现Dispose方法,手动清理掉内部非托管资源。  

public class DealData : IDisposable    {        private bool disposed = false;        private System.Timers.Timer t = new System.Timers.Timer();        private List listAll;        public void Dispose()        {            Dispose(true);            GC.SuppressFinalize(this);        }        protected virtual void Dispose(bool disposing)        {            if (!disposed)            {                if (disposing)                {                    listAll.Clear();                    //释放托管资源                }                t.Dispose();                //释放非托管资源                disposed = true;            }        }        ~DealData() {            MessageBox.Show("析构函数");        }    }

          二,静态引起的内存泄漏现象

                (1)静态对象导致的内存堆积,程序不执行完毕,内存就不能释放

public class MySingletonClass{    private static MySingletonClass myInstance;    private static List
bigObjects = new List
(); private MySingletonClass(){} public static MySingletonClass MyInstance { get { if(myInstance == null) { myInstance = new MySingletonClass(); } return myInstance; } } public static IAmBig CreateBigObject() { var bigObject = new IAmBig(); bigobject.AllocateMemory(4096); bigObjects.add(bigObject); return bigObject; }}public class IAmBig{ }

 

 

转载于:https://www.cnblogs.com/LGDD/p/9522952.html

你可能感兴趣的文章
《OpenGL ES应用开发实践指南:Android卷》—— 1.3 初始化OpenGL
查看>>
马士兵教学语录
查看>>
计算机网络与Internet应用
查看>>
MongodDB学习笔记(二)(复制)
查看>>
oracle在线迁移同步数据,数据库报错
查看>>
linux性能剖析工具
查看>>
VS2005环境下采用makefile编译、使用libjpeg.lib函数库
查看>>
EBS多语言
查看>>
说说设计模式~ 模版模式(Template)
查看>>
【linux】文件隐藏属性
查看>>
Java 命名规则
查看>>
RTC设备驱动
查看>>
小公司的管理
查看>>
无废话WCF入门教程三[WCF的宿主]
查看>>
iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势)
查看>>
详细解析:如何制作嵌入式Linux文件系统
查看>>
C# 两个独立exe程序直接通信
查看>>
【Unity3d】【项目学习心得】从资源server下载资源(一)
查看>>
C# WinForm 技巧八:界面开发之“WeifenLuo.WinFormsUI.Docking+OutLookBar” 使用
查看>>
Image Wall - jQuery & CSS3 图片墙效果
查看>>