• <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++程序的人基本上都知道這個問題。在我們周圍避免這些問題的常規(guī)方法
            也很多,諸如auto_ptr(及其他基于template的原始指針wrapper)、SAFE_DELETE。當然也
            會有很多人在實現(xiàn)一個函數(shù)時會很勤勞地對每一個parameter進行合法判斷。

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

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

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

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

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

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

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

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

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

            評論

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

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

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

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

            # 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。恰好可以通過在策劃的腳本里做些修改而避免程序里那段代碼的執(zhí)行。這個跟具體的應用環(huán)境有關系,別誤會。  回復  更多評論   

            精品久久777| 欧美久久综合性欧美| 免费一级欧美大片久久网| 国产午夜精品久久久久九九| 婷婷久久五月天| 亚洲国产精品无码久久98| 麻豆成人久久精品二区三区免费| 青青国产成人久久91网| 国产91久久综合| 日产精品久久久久久久| 青青热久久国产久精品 | 亚洲国产精品婷婷久久| 热re99久久精品国99热| 国产激情久久久久影院老熟女| 精品多毛少妇人妻AV免费久久| 色婷婷久久综合中文久久蜜桃av | 久久久久精品国产亚洲AV无码| 精品999久久久久久中文字幕| 久久国内免费视频| 国产精品久久久久久久午夜片 | 91久久精品国产免费直播| 久久婷婷色综合一区二区| 久久久噜噜噜久久| 久久99精品久久久久久9蜜桃| 国产成人精品久久一区二区三区| 久久夜色精品国产噜噜亚洲a| 国产精品久久久久久久午夜片| 69国产成人综合久久精品| 久久久精品国产sm调教网站| 久久久噜噜噜久久熟女AA片| 久久久www免费人成精品| 久久国产欧美日韩精品免费| 国产精品久久久久久久人人看| 精品久久久久久久中文字幕| 久久精品成人免费看| 久久99精品综合国产首页| 久久夜色精品国产噜噜噜亚洲AV | 久久偷看各类wc女厕嘘嘘| 亚洲AV无码久久精品成人| 午夜久久久久久禁播电影| 漂亮人妻被黑人久久精品|