• <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

            低調(diào)做技術(shù)__歡迎移步我的獨立博客 codemaro.com 微博 kevinlynx

            指針和模塊健壯

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

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

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

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

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

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

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

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

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

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

            評論

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

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

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

            模塊內(nèi)使用的指針有時也可以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)境有關(guān)系,別誤會。  回復  更多評論   

            国产午夜精品久久久久九九电影| 亚洲精品视频久久久| 久久久国产一区二区三区| 久久久精品2019免费观看 | 久久精品国产亚洲av麻豆图片 | 精品久久久久一区二区三区| 久久精品九九亚洲精品天堂| 无码AV中文字幕久久专区| 久久人人爽人人爽人人av东京热| 久久久久久国产a免费观看黄色大片| 亚洲国产成人久久综合野外| 久久精品国产男包| 精品久久久久久无码不卡| 97精品伊人久久大香线蕉| 伊人久久大香线焦AV综合影院| 中文字幕乱码人妻无码久久| 久久久久久亚洲Av无码精品专口 | 国产精品欧美久久久久无广告| 国产精品无码久久四虎| 国内精品久久久久国产盗摄| 午夜精品久久影院蜜桃| 亚洲国产精品无码久久久蜜芽| 精品久久久久久久久午夜福利| www.久久99| 久久精品亚洲男人的天堂| 国产亚洲精久久久久久无码77777| 三级三级久久三级久久| 国产∨亚洲V天堂无码久久久| 51久久夜色精品国产| 久久午夜免费视频| 无码AV中文字幕久久专区| 91久久香蕉国产熟女线看| 久久精品国产免费观看| 一级做a爰片久久毛片人呢| 久久亚洲国产成人影院| 久久天堂电影网| 欧美日韩精品久久久久| 91精品国产色综久久| 国产美女亚洲精品久久久综合| 久久这里只有精品首页| 国产成人久久精品一区二区三区 |