You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 15:06:07