【发布时间】:2021-08-15 03:38:13
【问题描述】:
我有点困惑。一般来说,新的Brushes是不是应该在使用后删除呢? 每次运行以下代码时,我都担心内存泄漏:
case WM_CTLCOLORLISTBOX:
{
HBRUSH hbrush;
hbrush = CreateSolidBrush(RGB(255, 255, 0)); // Green BackColor in ComboBox List area
HWND hTest = (HWND)lParam;
COMBOBOXINFO ci = { sizeof(COMBOBOXINFO) };
GetComboBoxInfo(hComboMode, &ci); // CBS_DROPDOWNLIST
if (hTest == ci.hwndItem || hTest == ci.hwndList)
{
HDC hdc = (HDC)wParam;
SetTextColor(hdc, RGB(0, 0, 0)); // Black Text in ComboBox List area
SetBkMode(hdc, TRANSPARENT);
return (INT_PTR)hbrush;
}
// DeleteObject(hbrush);
}
有两件事让我感到困惑。首先,如果控制权进入 if 语句,那么据我所知,只要 return 语句执行,就根本没有机会执行 deleteObject(hbrush) 吗? case 语句是在那个时候退出的吗?那么,如果是这种情况,那么我将永远无法删除画笔,因为我需要将它作为返回语句的一部分传回?顺便说一句,这段代码是我在 SO 上找到的不同代码段的“大杂烩”。我需要补充一点,在原始代码中,第一行是“static HBRUSH hBrush”。为了讨论的目的,我特意删除了“静态”这个词,在这里。请原谅我的无知,但我所知道的是“静态”将在堆上创建变量 - 而不是在堆栈上,随后执行代码将一遍又一遍地发现处于相同状态的变量;它不是像我现在那样每次都动态创建的。
我感到困惑的是,如果变量被设为“静态”,那么我是否还需要在某个时候“删除”它?既然是静态创建的,就不会有“内存泄露”?
很抱歉给您带来了困惑。我很久没有用 C++ 编程了。我正在慢慢地学习绳索。提前感谢您的帮助和指导。
【问题讨论】:
-
需要在
WM_CREATE或WM_INITDIALOG上调用一次CreateSolidBrush并将结果保存在与您的窗口关联的类对象中。并在WM_DESTROY上致电DeleteObject -
@RbMm:所以我不能“创建”新的 HBRUSH 对象,最好是在 WM_CREATE 上创建它们并在 WM_DESTROY 上删除它们?
-
当然您可以在任何地点/时间创建新的 HBRUSH 对象。另一个问题 - 这会很好并且有意义。通常在窗口创建和保存/使用时创建“当前”画笔。您可以根据某些事件重新创建画笔(删除旧的/创建并保存新的)。例如 - 当用户决定更改它时。
-
@RbMm:我在 WM_CREATE 上尝试了 CreateSolidBrush 并得到以下结果:“错误 C2360 的 'CustomBrush' 初始化被 'case' 标签跳过”?我决定将声明移至全局范围...
-
将声明移动到全局范围 - 错误。 'CustomBrush' 的错误 C2360 初始化被 'case' 标签跳过 仅表示 c++ 代码中的错误
标签: c++ windows winapi memory-leaks combobox