new 配 delete,new[] 配 delete[]nullptr
// 現代 C++ 首選
std::unique_ptr p = std::make_unique();
std::shared_ptr sp = std::make_shared();
// 自訂刪除器
auto fp = std::unique_ptr(fopen("a.txt","r"), fclose);
Boost 智慧指標 (專案若未 C++11) 提供 shared_ptr (執行緒安全、可放 STL 容器)、scoped_ptr 等。
| 工具 | 特色 | VS 整合 |
|---|---|---|
| CodeWizard | 500+ 內建規則,即時提示違規行 | 工具列整合,專案層級啟用 |
| PC-Lint | 深度語義分析,1000+ 常見錯誤模式 | 需手動配置,Jon Zyzyck 報表產生器輔助 |
// 非 MFC 專案 StdAfx.h 頂端
#define _CRTDBG_MAP_ALLOC
#include
#include
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
// 每個 .cpp 頂端
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// 程式進入點啟用
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
MFC 專案僅需 .cpp 標頭區塊,MFC 已處理其餘。
CObject:重載 Dump(),afxDump.SetDepth(1)CObject:自訂 _CLIENT_BLOCK 子類型、重載 operator new、註冊 _CrtSetDumpClientLinker → System → Stack Reserve Size/GS (緩衝區安全檢查) 、/RTCs (執行期檢查)| 錯誤類型 | 偵錯版輸出 | 斷言 |
|---|---|---|
| 寫入越界 (上溢) | Damage: after block... | _BLOCK_TYPE_IS_VALID |
| 寫入越界 (下溢) | Damage: before block... | _BLOCK_TYPE_IS_VALID |
| 刪除非堆指標 | _CrtIsValidHeapPointer 失敗 | _CrtIsValidHeapPointer |
| 重複釋放 | _BLOCK_TYPE_IS_VALID 失敗 | _BLOCK_TYPE_IS_VALID |
預防:delete p; p = nullptr;
// 崩潰回呼
LONG WINAPI CrashHandler(EXCEPTION_POINTERS* ep) {
MINIDUMP_EXCEPTION_INFORMATION mei = { GetCurrentThreadId(), ep, FALSE };
HANDLE hFile = CreateFile("crash.dmp", GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile,
MiniDumpNormal, &mei, NULL, NULL);
CloseHandle(hFile);
return EXCEPTION_EXECUTE_HANDLER;
}
// 初始化
SetUnhandledExceptionFilter(CrashHandler);
dbghelp.h/lib/dll (Windows SDK)/DEBUG 產生 .pdb.dmp → F5 重現崩潰現場記憶體缺陷是 C++ 專案最大隱憂,但透過規範預防 → 靜態分析 → 執行期檢測 → 除錯診斷 → 崩潰事後分析 的分層防禦,配合自動化流程,可將風險降至最低。核心心法:**資源交給物件管理 (RAII),工具輔助人工,流程固化最佳實務**。