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

如何释放BITMAP结构体?使用BITMAP获取位图信息后释放方法咨询

关于BITMAP结构体的释放问题

嗨,我来帮你理清这个困惑~首先得明确两个关键点:BITMAP结构体和HBITMAP句柄是完全不同的东西,它们的内存管理方式天差地别。

为什么delete和DeleteObject对bm无效?

  • delete没用的原因:你代码里的bm是直接在栈上声明的本地变量(BITMAP bm;),它的内存由编译器自动分配和回收,根本不是用new在堆上申请的内存,所以delete完全不适用——delete只对应new分配的堆内存。
  • DeleteObject无效的原因:这个API是用来销毁GDI对象的(比如HBITMAP、HBRUSH这类句柄对应的资源),而bm只是一个存储位图元数据的普通结构体,它不是GDI对象,调用DeleteObject(&bm)不仅没用,还可能触发未定义行为。

正确的处理方式

  1. 不需要手动释放bm:当bm所在的作用域结束时(比如函数执行完毕、代码块结束),栈内存会自动被回收,你完全不用管它。
  2. 必须释放的是hBitmap:hBitmap是加载得到的GDI位图句柄,这才是占用系统GDI资源的对象。当你不再需要它时,一定要调用DeleteObject(hBitmap)来销毁,避免GDI资源泄漏。

举个正确的代码示例:

BITMAP bm;
HBITMAP hBitmap = (HBITMAP)LoadImage(...); // 加载位图资源
if (hBitmap != nullptr) {
    GetObject(hBitmap, sizeof(BITMAP), &bm);
    // 在这里使用bm中的位图信息完成你的业务逻辑
    
    DeleteObject(hBitmap); // 用完位图句柄后,销毁对应的GDI资源
}

内容的提问来源于stack exchange,提问作者Jefrey Sobreira Santos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:07:21