这篇文章主要介绍了C++与C语言有哪些关系的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++与C语言有哪些关系文章都会有所收获,下面我们一起来看看吧。
错误1: 没有明确的结束方法
几乎可以完全肯定地说,对于大多数C++编程人员而言,C#与C++***的不同之处就在于碎片收集。这也意味着编程人员再也无需担心内存泄露和确保删除所有没有用的指针。但我们再也无法准确地控制杀死无用的对象这个过程。事实上,在C#中没有明确的destructor.
假如使用非可治理性资源,在不使用这些资源后,必须明确地释放它。对资源的隐性控制是由Finalize方法(也被称为finalizer)提供的,当对象被销毁时,它就会被碎片收集程序调用收回对象所占用的资源。finalizer该当只释放被销毁对象占用的非可治理性资源,而不应牵涉到其他对象。
详细介绍C++编程实例说明
阐述C++的编程工具几大重要元素
深度剖析C++开发工具种种问题
漫谈C++编程的编程技巧与技巧
浅析C++程序设计学习与实验系统
假如在程序中只使用了可治理性资源,那就无需也不应当执行Finalize方法,只要在非可治理性资源的处理中才会用到Finalize方法。由于finalizer需要占用一定的资源,因此应当只在需要它的方法中执行finalizer.直接调用一个对象的Finalize方法是绝对不答应的(除非是在子类的Finalize中调用基础类的Finalize.),碎片收集程序会主动地调用Finalize.
从语法上看,C#中的destructor与C++非常相似,但其实它们是完全不同的。C++语法中的destructor只是定义Finalize方法的捷径。因此,下面的二段代码是有区别的:
~MyClass() { // 需要完成的任务 } MyClass.Finalize() {// 需要完成的任务 base.Finalize(); }
错误2:Finalize和Dispose使用谁?
从上面的论述中我们已经很清楚,显性地调用finalizer是不答应的,它只能被碎片收集程序调用。假如期望尽快地释放一些不再使用的数量有限的非可治理性资源(如文件句柄),则该当使用IDisposable界面,这一界面有个Dispose方法,它能够帮你完成这个任务。Dispose是无需等待Finalize被调用而能够释放非可治理性资源的方法。
假如已经使用了Dispose方法,则应当阻止碎片收集程序再对相应的对象执行Finalize方法。为此,需要调用静态方法GC.SuppressFinalize,并将相应对象的指针传递给它作为参数,Finalize方法就能调用Dispose方法了。据此,我们能够得到如下的代码:
public void Dispose() { // 完成清理操作 // 通知GC不要再调用Finalize方法 GC.SuppressFinalize(this); } public override void Finalize() { Dispose(); base.Finalize(); }
对于有些对象,可能调用Close方法就更合适(例如,对于文件对象调用Close就比Dispose更合适),可以通过创建一个private属性的Dispose方法和public属性的Close方法,并让Close调用Dispose来实现对某些对象调用Close方法。
由于不能确定一定会调用Dispose,而且finalizer的执行也是不确定的(我们无法控制GC会在何时运行),C#提供了一个Using语句来保证Dispose方法会在尽可能早的时间被调用。一般的方法是定义使用哪个对象,然后用括号为这些对象指定一个活动的范围,当碰到最内层的括号时,Dispose方法就会被主动调用,对该对象进行处理。
对于有些对象,可能调用Close方法就更合适(例如,对于文件对象调用Close就比Dispose更合适),可以通过创建一个private属性的Dispose方法和public属性的Close方法,并让Close调用Dispose来实现对某些对象调用C++语法方法。
关于“C++与C语言有哪些关系”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“C++与C语言有哪些关系”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。