笔者带您走进C 编程门说明
创始人
2024-06-20 10:51:32
0

在本篇文章中我们将讨论C++编程人员最轻易犯的十个错误,出于商业目的。某些商业公司实现的时候可能会添加一些其认为可行的或者更加好的特性。下面进行学习讨论。。

几乎可以完全肯定地说,对于大多数C++编程人员而言,C#与C++最大的不同之处就在于碎片收集。这也意味着编程人员再也无需担心内存泄露和确保删除所有没有用的指针。但我们再也无法准确地控制杀死无用的对象这个过程。事实上,在C#中没有明确的destructor.

假如使用非可治理性资源,在不使用这些资源后,必须明确地释放它。对资源的隐性控制是由Finalize方法(也被称为finalizer)提供的,当对象被销毁时,它就会被碎片收集程序调用收回对象所占用的资源。finalizer该当只释放被销毁对象占用的非可治理性资源。#t#

而不应牵涉到其他对象。假如在程序中只使用了可治理性资源,那就无需也不应当执行Finalize方法,只要在非可治理性资源的处理中才会用到Finalize方法。由于finalizer需要占用一定的资源,因此应当只在需要它的方法中执行finalizer.直接调用一个对象的Finalize方法是绝对不答应的(除非是在子类的Finalize中调用基础类的Finalize.),碎片收集程序会主动地调用Finalize.

从语法上看,C#中的destructor与C++非常相似,但其实它们是完全不同的。C#中的destructor只是定义Finalize方法的捷径。因此,下面的二段代码是有区别的:

  1.   ~MyClass()  
  2. { // 需要完成的任务  
  3. }  
  4.   MyClass.Finalize() {// 需要完成的任务  
  5. base.Finalize();  
  6. }  

从上面的论述中我们已经很清楚,显性地调用finalizer是不答应的,它只能被碎片收集程序调用。假如期望尽快地释放一些不再使用的数量有限的非可治理性资源(如文件句柄),则该当使用IDisposable界面,这一界面有个Dispose方法,它能够帮你完成这个任务。Dispose是无需等待Finalize被调用而能够释放非可治理性资源的方法。

假如已经使用了Dispose方法,则应当阻止碎片收集程序再对相应的对象执行Finalize方法。为此,需要调用静态方法GC.SuppressFinalize,并将相应对象的指针传递给它作为参数,Finalize方法就能调用Dispose方法了。据此,我们能够得到如下的代码:

  1. public void Dispose()  
  2. {  
  3. // 完成清理操作  
  4. // 通知GC不要再调用Finalize方法  
  5. GC.SuppressFinalize(this);  
  6. }  
  7. public override void Finalize() {  
  8. Dispose(); base.Finalize();  
  9. }  

对于有些对象,可能调用Close方法就更合适(例如,对于文件对象调用Close就比Dispose更合适),可以通过创建一个private属性的Dispose方法和public属性的Close方法,并让Close调用Dispose来实现对某些对象调用Close方法。

由于不能确定一定会调用Dispose,而且finalizer的执行也是不确定的(我们无法控制GC会在何时运行),C++提供了一个Using语句来保证Dispose方法会在尽可能早的时间被调用。一般的方法是定义使用哪个对象,然后用括号为这些对象指定一个活动的范围,当碰到最内层的括号时,Dispose方法就会被主动调用,对该对象进行处理。

在本例的第一部分中,C++编程是在Using语句中创建的。当Using语句结束时,系统就会调用Dispose,对Font对象进行处理。在本例的第二部分,Font对象是在Using语句外部创建的,在决定使用它时,再将它放在Using语句内,当Using语句结束时,系统就会调用Dispose.Using语句还能防止其他意外的发生,保证系统一定会调用Dispose。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...