(1) 棧上變數必須初始化
(2) 從堆上分配的記憶體必須初始化
(3) 棧上局部變數是否有大陣列變數,導致棧超出預設限制溢出
(4) 棧中是否有不合理的遞迴,導致棧超出預設限制溢出
(5) 必須對記憶體耗盡的情況進行處理. 注意new在記憶體不足時的處理方式
(6) 釋放某個指標後,必須將該指標變數賦值為NULL, 避免野指標的出現
(7) 禁止對同一指標delete或者free兩次或以上
(8) 對數組操作,必須強制確保下標不會越界
(9) 避免頻繁的不等長小記憶體申請和釋放
(10) 記憶體申請和釋放必須配對,防止記憶體流失
(11) 析構數群組類型必須使用[] delete形式
(12) free和malloc, delete和new 必須配對使用,不能混用
(13) 線程的使用也是佔用了記憶體,是否考慮到了線程釋放
(14) 對於覆蓋標準的operator new和operator delete函數, 必須配對重寫
(15) 對於記憶體長度,不能靠自己計算,必須使用sizeof和注意位元組對齊
(16) 對於C字串,是否考慮到字串末位的'/0'結束符, 比如: char *p = "WoKao"; char buffer[5]; strpcy(buffer, p);
(17) 使用strcpy(char *dest, const char *src)等str系列函數,是否考慮到了dest緩衝溢出的情況, 應該優先確保dest不會溢出或者使用n族函數
(18) 使用int sprintf(char *string, char *farmat [,argument,...]);函數的時候是否考慮到了溢出,應該優先確保string不會溢出或者使用snprintf函數
(19) 使用fgets函數替代gets
(20) mem族函數注意確保操作空間不會溢出
(21) 進行記憶體拷貝,賦值或者初始化的時候,盡量用mem函數族替代迴圈操作
(22) 小心指標和數組的區別, 比如const char *p = "12345678", char buffer[] = "12345678"; cout<<sizeof(p)<<endl, cout<<sizeof(buffer)<<endl;等等
(23) 是否試圖修改常量字串,比如const char* p = "WoKao", p[0] ='R';
(24) 是否考慮數組名作為函數參數傳遞時,數組退化為指標。
(25) 注意避免大量臨時對象的產生導致記憶體的急速消耗, 比如連續的很長的 string + 操作
(26) 注意避免對臨時對象進行引用,比如 string a = "123"; string b = "456"; const char* p = (a + b).c_str();
(27) 在函數參數傳遞時,盡量使用指標或者引用,避免直接傳值操作,特別是大物件類型
(28) 對於auto_ptr智能指標的使用,是否考慮到了所有權的轉移,導致的記憶體釋放
(29) 對於vector類,是否考慮到了其內部記憶體不足時,其自動擴充2倍記憶體機制,對程式運行是否有影響
(30) 在使用STL string類的時候,是否考慮了string類實現的多樣性對程式的影響。
(31) 在某個模組,對象需要結束其生命週期的時候,是否釋放了其對應的記憶體資源。比如C++的解構函式中是否delete了其對應的記憶體資源
(32) 小心共用記憶體上存放有vtable的對象,另外一個進程進行刪除時,導致非法訪問
(33) 不能夠對含有vtable的對象進行memset初始化
(34) 計算結構變數位移必須使用offsetof