在面向对象的程序设计中,类是一种事物的抽象,它并非实物,故本文其实描述的应该是一个类的对象如何实现自杀;之因此提高到类的高度,是由于实现自杀的函数(方法)是要由类来提供的,并且该类的全部对象都是利用这样的方法自杀的。安全
为何要实现类的自杀?一个类对象要结束本身的生命时,能够直接由建立该对象(例如:new)的主人杀死它(例如:detele)就好了嘛!说的没错,大多数状况下的确是这样的,但凡事总有例外嘛。微信
下面咱们首先分析一下一个类对象究竟什么时候死掉吧!咱们把想死的类对象称为A,另一个类对象称为B。网络
【状况1】:框架
A是类B的成员变量。此时B就是A的主人了,主人B在本身死掉(析构)以前会将A杀死,这种状况下A成了B的陪葬品,谁叫B是本身的主子呢!函数
【状况2】:学习
A是在B的某个函数中临时建立出来的对象。当函数结束后,A的生命就天然终结了,实际上是被系统杀死了。此时的A只是这部程序剧本中的一个小小的过客。this
【状况3】:.net
A是在某个特殊的时候某个地方被B经过new的方法建立的,这时会有一把枪一直指向它。这把对准它的枪可能被B持有,也可能被B转给了C或者D持有,只要任何人拿枪指向了它,它就得乖乖听话,遵从指挥。
线程
这时,A的生命什么时候终结彻底得看持枪对准它的人的心情了,只要人家一不高兴,随时均可以经过delete把它毙掉。固然,若持枪对准它的人在死的时候都忘记杀死它或者你们的枪都指向了其余地方的话,它便成为了一块被泄露的内存,一直没有机会死去。设计
【状况4】:
A是全局的静态对象。这时它的生死不是其余人能够左右的,它有着极长的寿命,随着整个程序的启动而诞生,随着整个程序的结束而死亡。它会在整个程序即将结束前,在其余的非静态类或者变量都死去以后,与各位静态对象们一块儿光荣地被系统杀掉。
【状况5】:
可能A还有其余的死法,这里我就不一一列举了。
下面咱们切入正题,讨论一下类的自杀行为。经过以上几种状况咱们能够看出,对象A的死都不是自愿的,都是由系统或者主人强行杀死它的,那么,究竟什么状况下会出现A本身想死呢?
【状况1】:
类A是一个任务执行者,该任务的特色是: 当任务执行完毕后,A必须自杀或者通知上级把本身杀死。
例如:A为视频播放执行者类,当上级建立出A类的对象,并告知A须要播放的资源的必要信息后,A即启动对该视频资源的播放,因为播放是否结束只有底层A才知道,上级是不可能第一时间知道播放已经结束的,这时播放资源该如何正常释放呢?上级如何才能知道什么时候把A对象干掉呢?
这时有两种途径:
(1) 由A自行了断,即自杀,不须要上级再操心,这种状况上级仍是挺满意的,很省事。
(2) 由A经过某种方式告诉上级:"播放完毕,能够把我干掉了。" 虽然还得让上级操心,不过上级处理起来也容器,一刀干掉A就好了。
【状况2】:
类A身负国恨家仇,当上级要它死时,它不能当即死掉,而是要继续完成最后的使命后,再自行了断。
例如:A为某网络传输的发送者,它的任务是将上级交给它的东西发送到网络接收端B。具体过程是这样的:上级每次都把须要传输给B的东西塞到了A的缓冲区中,A只需不断地定时从缓冲区取出必定量的数据,而后发送到B便可。
传输一段时间后,上级发现须要传递到B的东西已经所有塞给A了,因而命令A:“你自杀吧!”;(设置A的自杀变量为true)。这时A发现本身缓冲区的东西尚未传输完毕呢,因而回答上级:“哦,好的,一会我会自杀的”,因而,当A将缓冲区的东西所有传输完毕后,便自杀了。
这种状况与上面状况1极为类似,但状况仍是略有不一样的,可能我举得例子不够典型,读者能够本身尝试建立一个更加典型的例子。
【状况3】:
类A执行任务的过程当中遇到了重大的问题(异常),须要通知上级干掉本身以保证程序正常运行或者资源的正常释放。
例如:仍是举网络发送者的例子吧,例如A为某网络传输的发送者,任务依然是向指定目的地址B发送数据。原本这份工做也挺简单的,但恰恰老天捉弄人,网络出现了一些问题,致使发送数据时出现一些异常。这时A敏锐地觉察到了网络的异常状况,这样继续发送数据到B,可能会致使B接收到一些错误的数据,极可能发生一些意想不到的异常,所以,A必须中止数据的发送。这时,A有两种选择:(1) 苟且偷生。它大可关闭网络发送的链接,而且将发送缓冲区中的数据扔掉,应该可以保证程序的平安无事,只是上级非常奇怪,为何最近B常常告诉本身为何没有发东西过去了?(2)通知上级杀掉本身。A通过仔细权衡,这次异常问题重大,必须当即通知上级干掉本身,以保证资源的正常释放,以及后续工做的正常运做。
固然,这种状况下的自杀想法必定是发生了重大异常,必须经过干掉本身才可以保证后续工做的状况下,A才会产生自杀的想法的。
【小结】:
咱们知道,到达目的地的路径每每不仅一条。上面描述的各类状况其实也都很类似,而且是能够没必要使用自杀策略实现最终的目的,好比说:上级开辟一个线程,定时不断地去询问A的状态,一旦发现A完成任务了能够死了或者说A遇到异常了想死了,立刻将A杀死便可。咱们本文讨论的自杀行为只是达到目的的另一条路径而已。
这里咱们须要注意,咱们说的自杀,主要指的是想自杀,实现这样的想法有两种途径,第一种是本身把本身杀死,即“自行了断”;另一种是经过通知其余人,达到让人家把本身杀掉的目的,即“借刀杀己”。
下面咱们将讨论一下A到底有哪些办法实现上面描述的自杀行为?
【方法1:发送消息】:
这种方法有必定的局限性,它只能用于MFC的框架下,由于MFC实现了消息机制,咱们能够利用该消息机制将底层的自杀想法传达到上级,再由上级杀死本身便可。
具体用法见MFC的PostMessage和SendMessage两个函数。
本方法属于“借刀杀己”。
【方法2:回调】:
由外界使用者注册一个回调函数到本类中,当本类对象想自杀时,能够经过调用该回调函数通知到外界,外界能够在该回调函数中执行杀死该对象的代码。
回调是非MFC下实现通知机制的有效途径,这种方法其实也属于“借刀杀己”。
【方法3:开线程把本身干掉】:
这是一种高级的死法,真正实现了“自行了断”,不须要外界操心。在类对象产生了“自杀”的想法后,能够当即开启一个线程,将this指针传递过去,在该线程中执行杀死该类对象的代码,终结该对象的生命。
使用这种方式须要注意一个问题,那就是外界是不知道你已经死了,全部必定要防止外界在你死后依然使用你,故为了安全起见,自行了断前或者了断后仍是须要经过某种方式告知一下外界的。
【方法4:垃圾回收机制 】:
之因此取这个名字,是由于它的确有点像垃圾回收。咱们能够专门有一个线程,线程中会不断地扫描垃圾回收站(或许是某个静态单件类)中是否有须要清理的垃圾,如有,则无情地挥舞大刀干掉这些回收站中的垃圾;因而,当一个类对象想“自杀”时,便经过垃圾回收站提供的接口把本身扔到垃圾回收站中,静静地排队等待被无情地杀死。
一样,这也是一种“自行了断”的方式,一样须要注意与【方法3】一样的问题。
好了,如今“一个类如何实现自杀?”这个问题总算讨论清楚了,若是你们有什么意见或者有更好的补充,欢迎留言或者来信交流。
结束语
免费学习更多精品课程,登陆乐搏学院官网http://h.learnbo.cn/
或关注咱们的官方微博微信,还有更多惊喜哦~
本文出自 “Jhuster的专栏” 博客,请务必保留此出处http://ticktick.blog.51cto.com/823160/232030