• <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 閱讀(2344) 評論(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无码专| 午夜视频久久久久一区 | 青青青青久久精品国产h| 久久99精品国产一区二区三区| 99麻豆久久久国产精品免费| 国产精品内射久久久久欢欢| 免费无码国产欧美久久18| 久久国产精品99精品国产| 久久99精品久久久久久野外| 一本一道久久综合狠狠老| 亚洲国产精品热久久| 无码国内精品久久综合88 | 国产精品免费久久久久影院 | 国内精品久久久久影院亚洲| 色婷婷综合久久久久中文| 久久国产精品一区| 久久午夜羞羞影院免费观看 | 久久亚洲美女精品国产精品| 国产精品成人久久久久久久| 亚洲精品乱码久久久久66| 国内精品欧美久久精品| 久久精品人人槡人妻人人玩AV| 久久这里只有精品视频99| 久久电影网一区| 99久久综合狠狠综合久久止| 亚洲va国产va天堂va久久| 性做久久久久久久久| 久久se精品一区二区影院 | 日日噜噜夜夜狠狠久久丁香五月 | 亚洲中文久久精品无码| 午夜精品久久久久久| 成人午夜精品久久久久久久小说| 国产麻豆精品久久一二三| 亚洲va中文字幕无码久久| 无码人妻精品一区二区三区久久 | 欧美日韩精品久久久免费观看| 国产福利电影一区二区三区久久久久成人精品综合 | 国产福利电影一区二区三区久久久久成人精品综合 | 久久精品一本到99热免费| 久久人妻AV中文字幕| 97久久婷婷五月综合色d啪蜜芽|