当运行环境中包含垃圾回收机制时,区别开内存管理和资源管理,就非常重要了。典型地来说,垃圾回收器只对包含对象的内存之分配与释放感兴趣,它可不关心你的对象是否拥有其他的资源,如数据库连接或核心对象的句柄。
内存管理
本地C++为程序员提供了超越内存管理的直接控制能力,在堆栈上分配一个对象,意味着只有在进入特定函数时,才会为对象分配内存,而当函数返回或堆栈展开时,内存被释放。可使用操作符new来动态地为对象分配内存,此时内存分配在CRT堆中,并且需要程序员显存地对对象指针使用操作符delete,才能释放它。这种对内存的精确控制,也是C++可用于编写极度高效的程序的原因之一,但如果程序员不小心,这也是内存泄漏的原因。另一方面,你不需要求助于垃圾回收器来避免内存泄漏--实际上这是CLR所采取的方法,而且是一个非常有效的方法,当然,对于垃圾回收堆,也有其他一些好处,如改进的分配效率及引用位置相关的优势。所有这一切,都可以在C++中通过库支持来实现,但除此之处,CLR还提供了一个单一的内存管理编程模型,其对所有的编程语言都是通用的,想一想与C++中COM自动化对象相交互和调度数据类型所需做的一切工作,就会发现其重要意义所在--横跨数种编程语言的垃圾回收器,作用是非常巨大的。
为了效率,CLR也保留了堆栈的概念,以便值类型可在其上分配,但CLR也提供了一个newobj中间语言指令,以在托管堆中分配一个对象,但此指令只在C#中对引用对象使用操作符new时提供。在CLR中,没有与C++中的delete操作符对应的函数,当应用程序不再引用某对象时,分配的内存最后将由垃圾回收器回收。
当操作符new应用于引用类型时,托管C++也会生成newobj指令,当然,对此使用delete操作符是不合法的。这确实是一个矛盾,但同时也证明了为什么用C++指针概念来表示一个引用类型不是一个好的做法。
版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明!