第1章 基礎問題 1
1.1 運算符優先級引起的問題 1
1.2 不加括號的宏定義引起的錯誤 2
1.3 汙染環境的宏定義 3
1.4 多語句宏定義使用錯誤 4
1.5 char轉為int時高位符號擴展的問題 6
1.6 int轉為char時的數據損失 7
1.7 非法的數組下標 9
1.8 有符號int與無符號int比較的後果 10
1.9 有符號的睏惑 11
1.10 整除的精度問題 13
1.11 浮點數比較的精度問題 14
1.12 最小負整數取相反數溢齣 15
1.13 臨時變量溢齣 16
1.14 size_t導緻的死循環 17
1.15 誤用short引起緩衝區溢齣 18
1.16 區分continue和return 20
1.17 指針常量和常量指針的區彆 21
1.18 字符數組和指針不總是等價的 23
1.19 結構體成員變量初始化的隱患 24
1.20 返迴值非void的函數沒有返迴值 25
1.21 cin>>和getline混用導緻的奇怪問題 27
1.22 小結 29
第2章 編譯問題 30
2.1 動態鏈接庫加載錯誤版本 30
2.2 相同名稱靜態庫的鏈接順序 32
2.3 使用命名空間來區分不同cpp中的同名類 33
2.4 C++模闆編譯時依賴名稱查找 34
2.5 違背ODR原則可能會帶來的意想不到的問題 36
2.6 變量共用內存時使用O2優化編譯 38
2.7 小結 40
第3章 庫函數問題 41
3.1 sprintf函數引起的緩衝區溢齣 41
3.2 snprintf函數format參數的問題 43
3.3 錯誤使用snprintf函數返迴值 44
3.4 字符串復製不完整 45
3.5 string類的c_str方法使用不當 46
3.6 string類的“[]”操作符使用不正確 48
3.7 不正確的字符串比較 49
3.8 strncpy函數沒有復製結束符 51
3.9 調用memcpy函數前未初始化緩衝區 52
3.10 誤用sizeof操作符取字符串長度 53
3.11 string類find函數返迴值判定 54
3.12 stringstream的清空 56
3.13 調用strptime函數前需初始化tm 57
3.14 使用feof函數的陷阱 59
3.15 for循環中調用vector容器insert函數 60
3.16 multiset容器erase函數的誤用 62
3.17 慎用容器類erase函數的返迴值 63
3.18 for循環中調用vector容器erase函數 65
3.19 getopt函數參數問題 67
3.20 不用errno判斷係統調用是否成功 69
3.21 strcat函數造成的段錯誤 70
3.22 危險的strdup函數 71
3.23 小結 73
第4章 文件處理 74
4.1 程序異常退齣時未關閉已打開文件 74
4.2 目錄打開後未關閉 75
4.3 寫文件沒有調用fflush 76
4.4 讀文件fread的返迴值不能忽略 77
4.5 getline()使用不當導緻的死循環 78
4.6 未重置流狀態導緻讀文件錯誤 80
4.7 小結 82
第5章 類和對象 83
5.1 對象的淺復製 83
5.2 構造函數中的操作符重載 85
5.3 拷貝構造函數不能模闆化 87
5.4 析構函數未捕獲異常引發coredump 89
5.5 構造函數中拋齣異常引起內存泄露 91
5.6 多態性未生效 93
5.7 基類成員函數被隱藏 94
5.8 匿名對象引起的內存泄露 96
5.9 基類非虛析構函數引發內存泄露 97
5.10 刪除void*指針引發內存泄露 100
5.11 STL容器不會自動釋放指針指嚮的對象 102
5.12 靜態成員類內初始化 104
5.13 union作為類的成員時需要構造函數 105
5.14 成員函數尾部缺失const標注 107
5.15 使用memset初始化class 109
5.16 dynamic_cast轉換失敗返迴NULL 110
5.17 小結 113
第6章 內存使用 114
6.1 數組越界 114
6.2 數組定義和值初始化形式混淆 115
6.3 數組傳參時的sizeof 116
6.4 臨時對象的生存期 117
6.5 變量的作用域 119
6.6 指針變量的傳值和傳址 120
6.7 指針賦值和指針賦址的混淆 121
6.8 指針釋放後再次使用 122
6.9 重復申請內存未釋放 124
6.10 delete與delete[]的區彆 126
6.11 函數中途退齣忘記釋放內存 126
6.12 二維數組的內存泄露 127
6.13 臨時變量內存不能返迴 128
6.14 正確使用引用參數和引用返迴值 129
6.15 試圖産生的指針很可能不存在 130
6.16 結構體成員內存對齊問題 131
6.17 String對象何時需delete 134
6.18 小結 135
第7章 多綫程問題 136
7.1 局部靜態變量非綫程安全 136
7.2 string類append操作非綫程安全 138
7.3 中途退齣造成的綫程阻塞 142
7.4 結構體位域成員綫程安全問題 144
7.5 多綫程寫文件引發內容被覆蓋 146
7.6 綫程未join引起的內存泄露 148
7.7 小結 150
第8章 性能問題 151
8.1 strlen用作循環條件影響性能 151
8.2 STL容器list使用時忌頻繁調用size() 152
8.3 誤用clear迴收vector內存 154
8.4 calloc在glibc高版本下性能劣於低版本下 156
8.5 小結 157
第9章 C/C++編程中其他問題 158
9.1 中文截斷成亂碼 158
9.2 不必要的類型轉換 159
9.3 不確定的函數參數賦值 161
9.4 epoll邊沿觸發模式下的陷阱 163
9.5 小結 166
· · · · · · (
收起)