如题。另外,c#、c++、Java三者各自的区别(特点)是什么?我知道的是c#与c++的最大区别是c#有CLR

解决方案 »

  1.   

    托管跟非托管
    网络一堆资料说明他们的区别,楼主去GOOGLE一下吧
      

  2.   

    C#在unsafe模式下是害怕内存泄漏的
      

  3.   

    这是因为.NET有更强大的垃圾回收机制,即GC来保证...这个问题和C#无关,而且.NET不能保证绝对不会发生内存泄漏,再强大的防止内存泄漏机制也防不住一个愚蠢的程序员...在托管运行库环境中,垃圾回收堆管理所有类对象。此堆可监视对象的整个生存期,并且仅当程序的任何部分都不引用这些对象时才将其释放。这样可确保对象永远不会泄漏内存并且对对象的引用始终有效。在 .NET Framework 1.0 版中,公共语言运行库 (CLR) 具有一个用于大型对象堆的独立内存管理器。在某些情况下,该内存管理器不将未使用的内存返回给操作系统,在少数情况下,它还会使该内存不能垃圾回收。这样会由于虚拟地址空间碎片而导致内存分配失败。在 .NET Framework 1.1 和 2.0 版中,大型对象堆由称为堆片段的连续内存区域组成,这些区域完全对齐以使虚拟内存碎片减到最少。在垃圾回收过程中,从大型对象中回收的空间被合并起来并置于自由列表中。只包含自由列表项的堆片段被释放,内存被返回给操作系统。对大型对象堆所做的这些更改有效消除了由这种形式的虚拟地址空间碎片导致的内存分配故障。
      

  4.   

    再有,CLR不是C#与C++的区别...托管C++一样依赖CLR,而C#只是.NET的一种表示语言而已,远远不能代表.NET...
      

  5.   

    不仅仅是GC机制问题,甚至可以说首当其冲地肯定不是。内存泄漏,很多时候是c、c++中“指针”这种东西过于低劣、太难以发现bug造成的。
      

  6.   

    指针丢来丢去反复传递和重用于不同目的,编程者就自己都搞不清楚该怎样编程才能正确释放内存了。java、c#解决了野指针问题。不过,不要仅仅夸口说c#借鉴了java的GC,实际上早在几十年前,例如smalltalk,就有完美的GC,java也是借鉴很多比它早十几年的东西。
      

  7.   

    不用指针就不需要考虑内存泄漏了。一用到指针,就危险了,所以C#对指针的操作必须标注为unsafe,否则不让使用。
    想想每个操作都是强类型的,编译器可以在你程序编译时就检查出问题,而不至于到运行时才发现问题。但是如果用到了指针,返回的是一个地址,那个地址是只有运行时才知道对应了什么内容,有时你设置的是整型数组的指针,却指向了一个浮点型数组的位置,你说它还能正常处理吗?而这个在编译时无法被察觉的。