• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            loop_in_codes

            低調做技術__歡迎移步我的獨立博客 codemaro.com 微博 kevinlynx

            指針和模塊健壯

            仔細想想能導致一個C++程序崩潰的幾乎90%原因都是跟指針有關。空指針野指針,一不小心
            程序就崩了。寫C++程序的人基本上都知道這個問題。在我們周圍避免這些問題的常規方法
            也很多,諸如auto_ptr(及其他基于template的原始指針wrapper)、SAFE_DELETE。當然也
            會有很多人在實現一個函數時會很勤勞地對每一個parameter進行合法判斷。

            其實,我們都知道,auto_ptr這些東西始終是無法避免野指針和空指針帶來的災難。
            SAFE_DELETE也不能阻止別人使用這個空指針。

            在我看過的一些開源項目的代碼中,這些代碼給人的感覺就是別人總能詳細地掌控各種資源
            (包括指針及其他變量)的使用情況。相比之下,公司隔壁組的老大則顯得保守很多。他要
            求我們幾乎要對所有指針的使用進行空值判斷(野指針也判斷不了),當然,各種成員變量
            也要進行即使現在看上去沒多大用的初始化。

            也許,這樣做后程序是不會掛掉了。但是,就我們的觀點來看,這樣反而會隱藏一些BUG。
            為什么我們不能詳盡地去管理一個指針?一個指針變為空了,總是因為在這之前發生了錯誤
            。當然,野指針本身就是愚蠢代碼產生的東西,這里沒必要討論。空指針之所以為空,也是
            因為在很多時候我們把空作為失敗/錯誤/無效的標志。

            恰好上周我的一些代碼就真的在空指針上出現了問題。外網的服務器隨時會因為玩家的一些
            臨界操作行為而崩潰掉。雖然我通過修改腳本來屏蔽這個問題(因為不能說停機維護就停機
            維護),但是總感覺程序是不安全的。人不吃點教訓絕對不學乖。

            后來我對這個問題徹底思考了一下。很多程序員都自認聰明。在寫C++程序時,我從來不提
            供沒用的public接口,尤其是set/get。我也從來不對沒必要的成員變量進行初始化。我給
            的理由是對于這些東西我都有很清晰的把握,我為什么要做stupid的事情?

            但是,我幾乎從來沒有界定,指針在哪些情況下需要去判斷為空?函數的參數絕對不需要。
            假如函數的參數就是個空指針,那是client程序員的責任。僅供模塊內使用的指針(包含其
            他資源)在內部使用時也不需要去判斷。如果去判斷了,那說明你對你自己寫的模塊都缺乏
            精確的把握,證明你的設計思維不夠清晰。

            什么時候需要判斷?當指針依賴于外部環境時,例如讀配置文件、載入資源,因為外部因素
            不確定不在自己控制范圍內,那么進行判斷。同樣,當使用了其他模塊返回的指針值時,也
            需要判斷。這個其實和“外部環境”屬于同一種情況。因為我們對其他模塊也不清楚,更為
            隱蔽的是(隨著其他模塊的改變,將來會在你的模塊里爆發崩潰錯誤),其他模塊由別人維
            護,其變化更不受自己控制。之前我對這一點界定不是很清楚,這也是我犯錯的原因。

            現在想想,像游戲服務器這種程序,里面塞著各種各樣的游戲功能。無論是哪一個模塊出現
            個空指針訪問出錯的問題,都會直接讓服務器崩掉。關鍵是這個結果經常伴隨著玩家的損失
            。所以理想狀態下,把每一個模塊都放置在單獨的進程里,確實是很有好處的。

            posted on 2009-06-28 19:35 Kevin Lynx 閱讀(2338) 評論(5)  編輯 收藏 引用 所屬分類: 通用編程模塊架構

            評論

            # re: 指針和模塊健壯[未登錄] 2009-07-04 16:16 expter

            其實有時候編程習慣和風格占據很大因素!  回復  更多評論   

            # re: 指針和模塊健壯 2009-07-09 13:15 xsap

            模塊內使用的指針有時也可以ASSERT一下, 后續人員對模塊進行修改, 萬一其對模塊把握不夠大, 導致的一些錯誤比較容易暴露.  回復  更多評論   

            # re: 指針和模塊健壯 2009-07-16 22:24 owlcn

            "把每一個模塊都放置在單獨的進程里",每一個模塊的大小如何劃分呢。誠如你所說,游戲里有各種各樣的功能,哪些功能劃分到一個模塊,放到一個進程。哪些又應該獨立到別的進程呢?
            請問這個有什么原則或者說思路么?  回復  更多評論   

            # re: 指針和模塊健壯[未登錄] 2009-08-17 22:28 lin

            雖然我通過修改腳本來屏蔽這個問題(因為不能說停機維護就停機
            維護)


            zm,這個是怎么做的哦  回復  更多評論   

            # re: 指針和模塊健壯 2009-08-18 11:54 Kevin Lynx

            @lin
            當時那個BUG是因為C++代碼中對某個指針沒判斷,而由于某些臨界條件就會導致這個指針為NULL。恰好可以通過在策劃的腳本里做些修改而避免程序里那段代碼的執行。這個跟具體的應用環境有關系,別誤會。  回復  更多評論   

            久久免费视频网站| 久久精品蜜芽亚洲国产AV| 99热成人精品免费久久| 久久99精品国产麻豆婷婷| 久久99这里只有精品国产| 亚洲AV无码久久精品狠狠爱浪潮| 久久精品蜜芽亚洲国产AV| 一本久久久久久久| 欧美日韩精品久久久免费观看| 精品久久久久久中文字幕人妻最新| 99久久精品这里只有精品| 久久久国产精华液| 中文字幕一区二区三区久久网站| 国产精品久久久久久五月尺| 亚洲精品高清久久| 久久精品国产亚洲AV香蕉| 午夜精品久久久久9999高清| 久久亚洲精品成人AV| 欧美麻豆久久久久久中文| 中文字幕亚洲综合久久2| 日本欧美久久久久免费播放网 | 综合久久久久久中文字幕亚洲国产国产综合一区首 | 日韩人妻无码一区二区三区久久| 99久久国产亚洲高清观看2024| 中文精品久久久久人妻不卡| 亚洲国产日韩欧美综合久久| 亚洲午夜精品久久久久久人妖| 热re99久久精品国99热| 久久久亚洲AV波多野结衣| 亚洲国产高清精品线久久| 久久久久久极精品久久久| 99久久精品免费看国产免费| 国产精品久久久久影视不卡| 久久久久亚洲AV片无码下载蜜桃 | 国产精品丝袜久久久久久不卡| 激情伊人五月天久久综合| 亚洲国产精品久久电影欧美| 漂亮人妻被黑人久久精品| 午夜久久久久久禁播电影| 国内精品九九久久久精品| 99久久人妻无码精品系列|