文档介绍:请问C#编写程序时,哪些代码属于托管代码,哪些代码属于非托管代码?
调用一些COM,API的话是非托管的吧
以运行库为目标的代码称为托管代码,而不以运行库为目标的代码称为非托管代码。
在运行库组件‘ActiveX控件,API函数,指针运算,自制的资源文件…这些的非托管的,其它就是托管的.
在clr上编译运行的代码就是托管代码非CLR编译运行的代码就是非托管代码非托管代码用disposefreeusing释放大概吧
都是内存托管的,如果你要自己管理内存那就用
unsafe{}关键字标注出一块区域,你可以在这里使用指针,管理内存,这里代码不托管。
最近刚做过些跨平台调用的,对托管和非托管的问题,了解得也比较深刻
一般C#里面编写的代码的都是托管的代码,就是,对内存的管理,可以由平台本身帮你控制,而VC里面的代码则为非托管代码,它们所分配的内存空间必须由本身来释放
另外,从非托管代码,与托管的代码的转化‘Marshal类是一个不得不深入研究的类..….非常的奥妙!!!!
调试内存泄漏的应用程序发现并防止托管代码中出现内存泄漏
(-cn/magazine/)
JamesKovacs
本文讨论:
本文使用了以下技术:
.NETFramework
理解托管应用程序中的内存泄漏问
题
.
下载本文中所用的代码:(163KB)
浏览在线代码
目录
.NET应用程序中的内存
检测泄漏
堆栈内存泄漏
非托管堆内存泄漏
''泄漏〃托管堆内存
总结一提到托管代码中出现内存泄漏,很多开发人员的第一反应都认为这是不可能的。毕竟垃圾收集器(GC)会负责管理所有的内存,没错吧?但要知道,垃圾收集器只处理托管内存。基于Microsoft®.NETFramework的应用程序中大量使用了非托管内存,这些非托管内存既可以被公共语言运行库(CLR)使用,也可以在与非托管代码进行互操作时被程序员显式使用。在某些情况下,垃圾管理器似乎在逃避自己的职责,没有对托管内存进行有效处理。这通常是由于不易察觉的(也可能是非常明显的)编程错误妨碍了垃圾收集器的正常工作而造成的。作为经常与内存打交道的程序员,我们仍需要检查自己的应用程序,确保它们不会发生内存泄漏并能够合理有效地使用所需内存。
.NET应用程序中的内存
您大概已经知道,.NET应用程序中要使用多种类型的内存,包括:堆栈、非托管堆和托管堆。这里我们需要简单回顾一下。
堆栈堆栈用于存储应用程序执行过程中的局部变量、方法参数、返回值和其他临时值。堆栈按照每个线程进行分配,并作为每个线程完成其工作的一个暂存区。垃圾收集器并不负责清理堆栈,因为为方法调用预留的堆栈会在方法返回时被自动清理。但是请注意,垃圾收集器知道在堆栈上存储的对象的引用。当对象在一种方法中被实例化时,该对象的引用(
32位或64位整型值,取决于平台类型)将保留在堆栈中,而对象自身却存储于托管堆中,并在变量超出范围时被垃圾收集器收集。非托管堆非托管堆用于运行时数据结构、方法表、Microsoft中间语言(MSIL)、JITed代码等。非托管代码根据对象的实例化方式将其分配在非托管堆或堆栈上。托管代码可通过调用非托管的Win32®API或实例化COM对象来直接分配非托管堆内存。CLR出于自身的数据结构和代码原因广泛地使用非托管堆。
托管堆托管堆是用于分配托管对象的区域,同时也是垃圾收集器的域。CLR使用分代压缩垃圾收集器。垃圾收集器之所以称为分代式,是由于它将垃圾收集后保留下来的对象按生存时间进行划分,这样做有助于提高性能。:第0代、第1代和第2代(从年轻代到年老代)。垃圾收集器之所以称为压缩式,是因为它将对象重新定位于托管堆上,从而能够消除漏洞并保持可用内存的连续性。移动大型对象的开销很高,因此垃圾收集器将这些大型对象分配在独立的且不会压缩的大型对象堆上。有关托管堆和垃圾收集器的详细信息,请参阅JeffreyRichter所著的分为两部分的系列文章''垃圾收集器:“和''垃圾收隼器一第2部分:"。,,。
检测泄漏很多迹象能够表明应用程序正在发生内存泄漏。或许应用程