在面向對象的程序設計中,類是一種事物的抽象,它並非實物,故本文其實描述的應該是一個類的對象如何實現自殺;之因此提高到類的高度,是由於實現自殺的函數(方法)是要由類來提供的,並且該類的全部對象都是利用這樣的方法自殺的。安全
爲何要實現類的自殺?一個類對象要結束本身的生命時,能夠直接由建立該對象(例如: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