Debug/Release 非二元對立,而是預設編譯選項組合的標籤。可自訂混合模式 (如優化版 Debug)。
| 類別 | Debug | Release | 影響 |
|---|---|---|---|
| 運行庫 | /MDd /MTd /MLd (Debug CRT) | /MD /MT /ML (Release CRT) | Debug CRT 含檢查機制 (堆守衛、填充模式),較慢但易錯 |
| 優化 | /Od (關閉) | /O1 (最小) /O2 (最快) | Release 重排指令、內聯、省略幀指標、變數優化 |
| 調試宏 | /_DEBUG (定義) | /NDEBUG (定義) | 控制 assert, ASSERT, TRACE, VERIFY 編譯 |
| 偵錯資訊 | /ZI (Edit & Continue) | 無 (或 /Zi) | Debug 支援編輯後續跑 |
| 記憶體檢查 | /GZ (啟用) | 無 | Debug 初始化 0xCC/0xCD/0xDD,捕捉未初始化/越界/野指標 |
| 字串合併 | 無 | /GF (啟用) | Release 唯讀合併重複字串 |
| 最小重連結 | /Gm (啟用) | 無 | Debug 連結較快 |
EBP 棧基址,改用 ESP 相對定址。簽名錯誤導致 ESP 計算偏移,返回位址錯誤。afx_msg LRESULT OnMsg(WPARAM, LPARAM))、強制型別轉換掩蓋編譯警告。/Oy- 禁用 FPO,若正常則為此類錯誤。重定義 ON_MESSAGE 宏加入 static_cast 讓編譯器檢查簽名。volatile 變數被優化進暫存器volatile (僅保證可見性,非原子性)。int j; ... a[-1]=1; Debug 時 j 擋住,Release j 被優化掉 → 破壞返回位址。/GZ (Debug) 可模擬釋出檢查;啟用 /RTCs (堆疊幀檢查);靜態分析工具。_DEBUG/NDEBUG 控制的斷言/追蹤副作用assert/ASSERT/VERIFY/TRACE 宏中絕不可放有副作用的運算式 (賦值、修改狀態的函式呼叫)。0xCC/0xCD/0xDD 填充未初始化記憶體,指標值極大非法,易觸發存取違規暴露 Bug。NULL。strcpy 等不安全函式)。malloc/free, new/delete 嚴格配對,智慧指標/RAII 托管。free/delete 後立即置 NULL。volatile / 用原子操作 / 鎖。Debug/Release 差異本質是編譯器優化與運行庫檢查機制的取捨。Release 錯誤多源於未定義行為 (UB) 在優化下被放大。嚴守 C/C++ 規範、消除警告、善用靜態分析、單元測試覆蓋 Release 建置,是交付高質量軟體的必經之路。