c++为什么没有垃圾回收

垃圾回收
内存清理的另一个方面是垃圾回收。在支持垃圾回收的环境中,程序员几乎不必显式地释放与对象关联的
内存。运行时库会在某时刻自动清理没有任何引用的对象。
与C#和Java不一样,在C++语言中没有内建垃圾回收。在现代C++中,使用智能指针管理内存,在旧代
码中,则在对象层次通过new和delete管理内存。诸如shared_ptr的智能指针(稍后讨论)提供类似于“垃圾回收
后的内存”的功能,也就是说,销毁某资源的最新shared_ptr实例时,会同时销毁资源。在C++中实现真正的
垃圾回收是可能的,但不容易,而将自己从释放内存的任务中解放出来可能引入新麻烦。
标记(mark)和清扫(sweep)是一种垃圾回收的方法。使用这种方法的垃圾回收器定期检查程序中的每个指
针,并将指针引用的内存标记为仍在使用。在每一轮周期结束时,未标记的内存视为没有在使用,因而被释放。
如果愿意执行以下操作,那么可以在C++中实现标记和清扫算法:
(1) 在垃圾回收器中注册所有指针,这样垃圾回收器可轻松遍历所有指针。
(2) 让所有对象都从一个混入类中派生,这个混入类可能是GaibageCollectible,允许垃圾回收器将对象标
记为正在使用中。
(3) 确保在垃圾回收器运行时不能修改指针,从而保护对象的并发访问。
可以看出,这种垃圾回收方法需要程序员付出很多努力,甚至可能比使用delete更容易出错!人们己经尝
试在C++中实现安全简单的垃圾回收机制,’但是就算C++中出现了完美的垃圾回收机制,也不一定适用于所有
应用程序。垃圾回收存在以下缺点:
•当垃圾回收器正在运行时,程序可能停止响应。
•使用垃圾回收器时,析构函数具有不确定性。由于对象在被垃圾回收之前不会销毁,因此对象离开作
用域时不会立即执行析构函数。这意味着,由析构函数完成的资源清理操作(如关闭文件、释放锁等)
要在将来某个不确定的时刻进行。
编写一个垃圾回收机制是很难的。你无疑会犯错,因为它容易出错,而且很可能会降低运行速度

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值