C#和C++ 关于托管与非托管的问题

来源:百度知道 编辑:UC知道 时间:2024/05/21 15:27:33
我是做Asp.net 和C#.net的;大学里没有认真学习基础知识。现在十分后悔,因为我不想一直做一个WEB程序员。

现在请教一下您,我现在做的C#是托管的,也就是说我new了一个对象后可以不管它的生存状态,到一定时候.net framwork会自动回收它。
那么如果我调用该对象的Dispose()方法,是否就是手动将它回收了,这就是非托管代码的意思吗?

另外C++似乎是非托管的,在C++中是否是调用Delete()函数呢?
另,

C#是内存托管的,你new出来的对象C#系统还会自动创建一个系统指针指向它,如果你创建的指针都被销毁了,.NET系统就会自动利用系统指针将空间销毁掉,这个就是垃圾回收的原理,你new出来的对象用完后可以不用再管它,反正系统会解决一切,不过你也可以通过调用对象的Dispose方法来手动销毁,托管不托管与语言有关,而非使用方法,就好比坏人做了一件好事了那他就不再是坏人了么?
C++是非托管的,new出来的对象需要自己手动销毁,否则会内存泄露,C++销毁内存用delete,delete是一个语句运算符,不是函数,你还可以重载delete运算符,不过在C++中delete数组需要用delete[]来删除

什么是.net托管程序?
在该托管程序中,托管对象的创建,释放,以及整个程序的运行,都是由.net框架对其管理和操作的,不会直接提交给操作系统去操作,简单的说,就是委托框架管理该程序,

托管对象,是由.net框架的垃圾回收器回收的,你无法做到手动/主动释放一个托管对象,确实无法做到,调用Dispose()方法,仅仅是通知垃圾回收器:“该对象我不需要了,您可以释放掉它”,但并没有真正的释放该对象,垃圾回收器什么时候释放该对象?完全取决于垃圾回收器什么时候有“心情”释放它,所以,你永远都无法主动去释放一个托管对象,你也无法得知这个对象什么时候被垃圾回收器释放,

像c++这样的才是非托管对象,非托管程序直接由操作系统管理,你可以主动释放对象(用delete将它移出内存)

是否有自动的垃圾回收和是否托管没有直接的必然的联系。C++也有一些自动垃圾回收的机制。完全自动的垃圾回收是纯面向对象程序语言的特点之一。一般来说如果没有特殊需要,在C#中不需要手动释放资源。
说C#是托管代码意思是说C#语言的编译器编译结果并非机器码,而是中间语言(IL),在程序运行时,需要.NET Framework进行预编译,将中间语言编译成机器码然后再执行。托管是"托管"于.NET Framework的意思,与java托管于JVM是类似的。

Delete()函数?
语句吧
当你调用Dispose()时,CLR不一定立即收回,他要看是否这个被回收的对象还存