在使用 g++ 開發 C++ 程式時,程式中有一段循環反覆呼叫 push_back() 的代碼:
for (int i = 0; i < 5; ++i)
push_back();
這段代碼被呼叫 N 次後,執行到 push_back() 時拋出錯誤:malloc(): memory corruption (fast)。使用 GDB 逐步調試,最終進入 malloc.c 內部,報錯訊息為:
malloc.c:3096: sYSMALLOc: Assertion `(old_top == ...)' failed.
Aborted
初步懷疑是記憶體洩漏或堆空間不足,但調試半天無果。
經過與舊版本程式碼對比,發現錯誤源於結構體定義時使用了 #pragma pack(push, 1) 關閉記憶體對齊,但忘記在結構體定義結束後加上 #pragma pack(pop) 恢復預設對齊設置。
#pragma pack(push, 1)
// 定義結構體
#pragma pack(pop) // 這句漏寫了
這導致後續所有結構體、類別乃至標準庫容器(如 std::vector)的記憶體佈局全部被錯誤地壓縮為 1 位元組對齊。當 vector 內部進行記憶體分配、擴容時,分配器與實際物件大小不匹配,最終觸發 malloc 的一致性檢查失敗。
#pragma pack(push, n) 的地方,務必成對加上 #pragma pack(pop)。pack 指令封裝在獨立的頭文件中,減少影響範圍。-Wpadded 或靜態分析工具輔助檢測對齊問題。記憶體對齊修改具有全域性副作用,必須嚴格遵循「推疊/彈疊」配對原則。遇到莫名其妙的 malloc 錯誤、隨機崩潰時,優先檢查是否有未平衡的 #pragma pack 或結構體定義錯誤。