c++ 歸納總結

1.堅持下列措施可以避免內存越界:
? 數組的大小要考慮最大情況,避免數組分配空間不夠。
? 避免使用危險函數sprintf /vsprintf/strcpy/strcat/gets操作字符串,使用相對安全的函數snprintf/strncpy/strncat/fgets代替。
? 使用memcpy/memset時一定要確保長度不要越界
? 字符串考慮最後的’\0’, 確保所有字符串是以’\0’結束
? 指針加減操作時,考慮指針類型長度
? 數組下標進行檢查
? 使用時sizeof或者strlen計算結構/字符串長度,避免手工計算

2.堅持下列措施可以避免內存泄漏:
? 異常出口處檢查內存、定時器/文件句柄/Socket/隊列/信號量/GUI等資源是否全部釋放
? 刪除結構指針時,必須從底層向上層順序刪除
? 使用指針數組時,確保在釋放數組時,數組中的每個元素指針是否已經提前被釋放了
? 避免重複分配內存
? 小心使用有return、break語句的宏,確保前面資源已經釋放
? 檢查隊列中每個成員是否釋放

3.堅持下列措施可以避免引用已經釋放的內存空間:
? 內存釋放後,把指針置爲NULL;使用內存指針前進行非空判斷。
? 耦合度較強的模塊互相調用時,一定要仔細考慮其調用關係,防止已經刪除的對象被再次使用。
? 避免操作已發送消息的內存。
? 自動存儲對象的地址不應賦值給其他的在第一個對象已經停止存在後仍然保持的對象(具有更大作用域的對象或者靜態對象或者從一個函數返回的對象)


4.使用線程池機制,避免線程頻繁創建、銷燬的系統調用;使用內存池,對於頻繁申請、釋放的小塊內存,一次性申請一個大塊的內存,當系統申請內存時,從內存池獲取小塊內存,使用完畢再釋放到內存池中,避免內存申請釋放的頻繁系統調用.


5.以下情況可以使用init()函數來初始化:
? 需要提供初始化返回信息。
? 數據成員初始化可能拋異常。
? 數據成員初始化失敗會造成該類對象初始化失敗,引起不確定狀態。
? 數據成員初始化依賴this指針:構造函數沒結束,對象就沒有構造出來,構造函數內不能使用this成員;
? 數據成員初始化需要調用虛函數。在構造函數和析構函數中調用虛函數,會導致未定義的行爲。

6.建議2.4 明確有外部依賴關係的全局與靜態對象的初始化順序

7.虛函數與dynamic_cast類型轉換相比:
? 虛函數更安全,不會出現強制轉換錯的情況;
? 虛函數效率更高:用函數指針,避免條件判斷;
? 虛函數不需要在編碼時確定對象的真實類型,而dynamic_cast必須告知要轉成的類型,運行時若類型不當返回空指針或者拋異常;
? 虛函數適用性更強:虛函數是真正動態綁定;類型轉換當增加或刪除一個派生類時,dynamic_cast必須增減相應的代碼。

8.類的設計
隱藏信息
? 儘量減少全局和共享數據;
? 禁止成員函數返回成員可寫的引用或者指針;
? 將數據成員設爲私有的(struct除外),並提供相關存取函數;
? 避免爲每個類數據成員提供訪問函數;
? 運行時多態,將內部實現(派生類提供)與對外接口(基類提供)分離。

9.規則4.1 模塊間對外接口類不要暴露私有和保護成員

10.建議4.2 使用PIMPL模式,確保私有成員真正不可見

11.原則6.1 明確產品動態內存的申請與釋放原則
說明:之所以存在大量內存問題,主要原因是申請與釋放內存的規則混亂:
? 申請內存後,傳入子程序中,由子程序使用並釋放;
? 由子程序申請內存並返回父程序,層層調用後在某一個函數內釋放。
內存申請與釋放一般原則:
? 對象在退出其作用域時,就應該立即被釋放,而且要做到:誰申請,誰釋放。
? 函數內分配的內存, 函數退出之前要釋放,避免跨函數釋放;
? 類中數據成員的內存,在析構函數中確認並釋放;
? 全局變量、靜態變量的內存空間則在進程退出時,或相應的共享庫被卸載時,由操作系統回收;
? 如果程序分支很多或內存資源的分配與釋放不在同一個地方,要考慮使用RAII等資源跟蹤管理技術。

12.適用異常的幾個場景:
? 出現“不應該出現的”失敗,且不能被忽略必須處理,比如分配內存失敗。
? 上層應用決定如何處理在底層嵌套函數中 “不可能出現的” 失敗。
? 錯誤碼難以通過函數的返回值或參數返回,比如流。
? 許多第三方C++庫使用異常,必須在系統邊界與第三方C++庫結合處使用異常便於跟這些庫集成。
? 在測試框架中使用異常很方便。

13.建議8.3 使用string代替char*
說明:使用string代替char*有很多優勢,比如:
1. 不用考慮結尾的’\0’;
2. 可以直接使用+, =, ==等運算符以及其它字符串操作函數;
3. 不需要考慮內存分配操作,避免了顯式的new/delete,以及由此導致的錯誤;

14.採用如下方法可以減少臨時對象的產生。
? 用引用或指針類型的參數代替直接傳值;
? 用諸如+=代替+
? 使用匿名的臨時對象;
? 避免隱式轉換;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章