C++ Win32进程管理器开发中switch case对象出作用域引发访问违例
问题根因
你遇到的错误由两个编码失误共同导致:
- WM_INITDIALOG分支中创建的
TBuffer是栈上局部对象,分支执行完毕出作用域后自动触发析构,全局指针Buffer变成野指针,后续访问直接触发内存错误 - WM_DESTROY分支中错误使用
delete[]释放单个对象内存,delete[]仅用于释放new[]分配的数组内存,单个对象需使用普通delete
修复方案
1. 调整WM_INITDIALOG对象创建逻辑
将栈上局部对象改为堆上动态分配,手动控制生命周期:
case WM_INITDIALOG: { // 用new在堆上分配对象,生命周期持续到手动delete Buffer = new TBuffer(hWnd); ... return TRUE; }
2. 修正WM_DESTROY内存释放逻辑
将数组释放符delete[]改为普通对象释放符delete:
case WM_DESTROY: delete Buffer; PostQuitMessage(0); return TRUE;
额外优化建议
- 可以将
Buffer全局指针改为对话框类的成员变量,避免全局变量污染 - 若使用C++11及以上标准,可改用
std::unique_ptr<TBuffer>智能指针自动管理内存,无需手动调用delete,避免内存泄漏
内容的提问来源于stack exchange,提问作者Ilya
相关产品推荐
相关产品推荐

