使用BCM_SETIMAGELIST时应由谁销毁对应的HIMAGELIST对象?
BCM_SETIMAGELIST 关联HIMAGELIST的销毁规则说明
销毁责任归属
BCM_SETIMAGELIST传递给按钮控件的HIMAGELIST对象,所有权完全归创建该对象的调用方所有,系统按钮控件不会主动销毁关联的图像列表,仅持有句柄引用进行绘制使用。
WM_NCDESTROY 中的销毁操作规范
你可以直接在WM_NCDESTROY消息的处理逻辑中完成销毁,两种操作方式均合法:
- 直接调用
BCM_GETIMAGELIST获取当前关联的HIMAGELIST句柄,执行ImageList_Destroy销毁即可。WM_NCDESTROY是控件生命周期的最后一个消息,此时控件已经完成所有内部清理、不会再访问关联的图像列表,不会出现野指针访问异常。 - 若要做冗余防护避免后续其他逻辑误访问,也可以先调用
BCM_SETIMAGELIST将控件关联的图像列表设置为NULL,再销毁你拿到的原图像列表句柄,该操作不属于必须步骤,但不会产生额外副作用。
注意事项
- 仅销毁你自身模块创建的
HIMAGELIST,如果该图像列表是多控件共享的资源,需要确认所有使用方均已销毁后再执行销毁操作。 - 不要在
WM_DESTROY等更早的销毁消息中执行图像列表销毁,此时控件可能还未完成最终的绘制清理流程,存在访问已销毁资源的崩溃风险。
内容的提问来源于stack exchange,提问作者user3161924
相关产品推荐
相关产品推荐

