C#编程中的内存管理过程中的问题分析

来源 :计算机光盘软件与应用 | 被引量 : 0次 | 上传用户:rsbgrc
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘要:采用C#语言进行编程的时候,程序员不用对内存管理过多的关心,对内存产生的垃圾文件垃圾收集器会自动进行清理。当然, 对于一些高质量的代码编写,还是要对后台处理有所了解,清楚C#编程内存管理的一些原理及问题。本文主要是根据内存管理的一些内容进行分析,并对其管理过程中的一些问题进行处理。
  关键词:C#编程;内存管理;堆栈;托管堆
  中图分类号:TP312.1 文献标识码:A 文章编号:1007-9599 (2012) 20-0000-02
  对于C#编程而言,其主要是把数据分为两个类型,引用数据类型和值数据类型,在内存管理中,这两类数据存储的位置是不同的,引用数据类型主要存储于内存的托管堆中,而值数据类型主要存储于堆栈中。
  1 C#编程中内存管理的主要内容
  一般而言,采用虚拟寻址系统将程序中可用地址通过映射存储于内存中的实际地址上。对于硬件内存而言,其存储的方式都是由零开始向上递增存储,所以,如果要对内存中某一单元进行访问时,必须要有表示该存储单元的地址。在高级编程语言下,编译器最主要是作用之一就是要把可以理解的变量名改变为处理器可以理解的与之相对应的内存地址。
  1.1 堆栈。这是内存中的一个区域名称,主要用于存储值数据类型,在存储对象中,值数据类型进行调用时,首先将调用的所有方法传递到参数副本,在选择调用方法时,堆栈中存储的所有参数其实均为副本,所以在将值类型A传递到函数的过程中,A值是不会发生改变的。这与引用类型是不同的,引用类型一般会发生改变,主要是由于堆栈中所存储的是引用类型地址。
  1.2 托管堆。由于堆栈的功能强大,且性能相当高,但是其不足之处是变量的生命周期要求应该为嵌套,所以在对部分数据进行存储的时候过于苛刻。在此基础上产生了一种新的内存分配方式,即托管堆,该方法对部分数据的存储,并且保证了方法退出以后,在相当长的一段时间内,这些数据依然可以使用。该方法也简称为堆,是在内存中的另外一个区域内进行工作的。例如:
  {
  Customer customer1;
  Customer1=new Customer()
  Customer customer2= new Customer();
  }
  首先,声明一个Customer是customer1,然后在堆栈上对其进行存储分配。这里只是对其进行分配存储空间的引用,不是实际的对象,通过customer1占用的4字节空间对Customer对象在内存中的地址进行表示。进而执行第二行代码并完成操作。根据此例可以看出,引用类型的变量要比值类型变量建设过程复杂很多,且其性能下降的现象也不可避免。但是,可以采用将一个引用变量的值赋予另一个引用变量,其中一个出了作用域时,另一个会自动删除,而对象数据仍然存储在内存中,直到程序停止才会消失。如果将引用变量A传递给函数,也只是将变量A的引用进行了传递,换言之,也只是在堆栈上进行了内存的分配,即变量B,A和B所指向的内存地址是相同的,如果B改变,那么A也会随之改变。
  1.3 装箱及拆箱。在将值数据类型与引用数据类型项目相互进行转化的时候主要采用装箱及拆箱的方法,装箱的过程是将值数据类型转换为引用数据类型,拆箱则相反,是将引用数据类型转换为值数据类型。
  1.4 垃圾收集。一般而言,NET运行库在运行一段时间以后,会自动的将系统所产生的垃圾信息收集到垃圾收集器中,释放托管的资源,这在多数情况下能很好的解决垃圾信息占用大量内存的情况。然而对于一些特殊情况时,就需要垃圾回收器强制性的在代码的某一处进行内存的释放,这个时候就要用到System.GC,即垃圾收集器。垃圾收集器最主要的用处是在代码中存有大量的对象,在这些对象刚停止引用时使用。就堆栈和托管而言,首先堆栈填充的方向是向下,即从高内存地址向低内存地址存储,其工作原理是先将内存变量进行分配,然后再进行内存释放,采用的是先进后出的原则,自下而上的对变量进行释放,这种工作原理主要是为了保证堆栈的运行规则与其变量的生命周期不会发生矛盾与冲突。但是由于其性能过高造成的变量不够灵活的问题,人们都希望通过另外一种方法对内存进行分配,保证数据的存储及方法退出后数据在一定时间段内依然可以使用,托管堆的引入很好的解决了这一问题,该堆主要是指在.NET中,垃圾收集器进行自动管理,这与堆栈是完全不同的,托管堆采用自下向上的分配原则,将自有空间全部置于已用空间的上部。
  2 C#编程中内存管理的主要问题
  内存分配是内存管理的第一个步骤,如何对其进行正确的分配,直接关系到程序运行的正确与否,因此必须对内存分配认真的对待。需要注意的是,在内存进行动态的分配过程中,是最容易出现问题的环节,所以在进行内存管理的时候,要对内存的动态分配过程更加的重视,本文主要对内存管理过程中的问题从以下几个方面进行研究分析:
  (1)采用new或者malloc完成内存的申请以后,要马上检查指针,查看其是否为NULL。要防止将指针值为NULL的内存进行使用。假设指针p是函数的参数,此时采用函数入口处通过if或者assert作为防错处理的措施。(2)对动态内存以及数组进行赋初值。主要是为了防止把没有经过初始化的内存作为右值使用,对于内存的缺省初值的研究在目前来说还没有一个统一的标准进行规范,所以在数组的创建过程中,不管采用什么样的方法都要重视赋初值,这样就避免了指针自动指向NULL,防止“野指针”现象的出现。(3)避免指针或者数组的下标越界。在具体的操作过程中,要小心发生“少1”或者“多1”等操作。在对数组进行使用的时候,常常会出现下标“少1”或者“多1”的操作现象。尤其在for循环语句中,由于循环的次数较多,因此很容易就会给搞错,最终造成整个数组在操作的过程中发生越界的现象。所以,在具体的操作过程中,要求程序员在编写程序的时候要认真,编写完成以后要仔细的进行检查。(4)动态内存的申请与释放。为防止内存泄露现象的发生,要求动态内存的申请和释放必须是配对的,一旦忘记了内存的释放,内存就会出现泄露现象。如果函数中存在此错误,那么该函数在被调用的过程中,就会丢失一块内存,且每次都是一样。在最初,系统内存较为充足,此时很难发现错误,但经过一段时间的使用以后,会出现程序突然死掉的情况,这时系统提示内存已耗尽,这就是为什么在大多数的初学者中出现的机器速度越来越慢,进而出现频频死机的一个原因。所以要对动态内存的申请和释放配对进行,在程序中所体现的malloc和free二者使用次数也应该是相同的,如果不同,肯定出现了错误,同理delete和new也是一样的。(5)delete和free在完成内存释放以后,要马上将指针设置到NULL,防止出现“野指针”的现象。例如一个指针p经过delete或者free以后,如果没有将其设置为NULL,那么往往指针p会被认为是合法的指针,但是实际情况是,该指针所传达的只是前一个内容的指示,在目前其仅仅是作为“垃圾”信息存在。
  3 结束语
  对内存的管理,很难用一篇文章来完整的进行阐述,因此本文主要对C#编程中内存管理的内容及常见的问题进行简单的分析和阐述,对于编程工作者而言,要对内存分配、回收等相关知识进行掌握。总而言之,对于常见的内存管理中的问题,可以根据本文所阐述的几个解决方法进行解决,以避免不可预测的错误发生。只有这样才能对内存的使用更加的合理,编写的程序才能高效的运行。
  参考文献:
  [1]韩耀堂.C#编程中的内存管理不该忽略的问题[J].计算机光盘软件与应用.2011(13).
  [2]陈郑军,游莲.浅析C#动态内存管理机制[J].重庆广播电视大学学报,2008(06).
  [3]凌建辉.浅析C#编程中的内存管理[J].科技资讯,2009(12).
其他文献
目的探讨应用2%洗必泰护理血透双腔留置管对预防导管相关性感染的·临床效果。方法将160名使用双腔留置导管作为血管通路的患者随机分为两组,观察组80例,使用2%的洗必泰消毒
P2P技术近年来发展得相当快,广泛应用各种网络活动中,但目前P2P技术存在诸多安全问题。本文笔者主要对P2P网络安全问题进行分析与探讨。
对于一些特殊结构的分式方程,若用一般的去分母方法求解,则解题过程常常比较繁琐;若采用特殊的解题方法和技巧,则可以达到简化解题过程的目的.
随着信息技术的不断发展和普及,在教育中引入信息技术已经成为了一种趋势。本文研究了CAI课件的基本内涵,并对多媒体CAI课件的应用以及开发进行了初步的研究,希望通过本文的研究
目的探讨经宫腔输卵管途径治疗输卵管妊娠护理的重要性。方法采用介入输卵管插管方法,全程规范化护理配合,插管成功后注入甲氨蝶呤60mg治疗24例输卵管妊娠。结果 20例获得成