Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Нужен ли вызов SelectObject()

wrwe werwer Ученик (122), на голосовании 2 месяца назад
Вот есть код:
     HDC HDCMem = CreateCompatibleDC(Item->hDC); 
HBITMAP hBitmap = CreateCompatibleBitmap(Item->hDC, Item->rcItem.right - Item->rcItem.left, Item->rcItem.bottom - Item->rcItem.top);
HGDIOBJ oldBitmap = SelectObject(HDCMem, hBitmap);

// Рисование

SelectObject(HDCMem, oldBitmap); // Нужен ли вызов вот этой функции?

DeleteObject(hBitmap);
DeleteDC(HDCMem);
Как говорят на многих форумах, старый объект необходимо вернуть в контекст устройства, чтобы избежать утечки ресурсов. Но по сути никакой утечки ресурсов я не заметил, в диспетчере задач рядом с процессом можно посмотреть кол-во GDI объектов, при этом их количество у меня не меняется. Значит функция DeleteObject(hBitmap); срабатывает, хотя в MSDN написано: "Не удаляйте объект рисунка (перо или кисть), пока он все еще выбран в контроллере домена." Или утечка ресурсов подразумевает утечку оперативной памяти? Хотя наблюдая в диспетчере задач, оперативная память программы не становится больше, при каждой перерисовки окна
Голосование за лучший ответ
Гилозоика Пифагора Гуру (4623) 3 месяца назад
Ты прав, вызов `SelectObject(HDCMem, oldBitmap)` не обязательно необходим в данном случае.

**Вот почему:**

* **`DeleteObject(hBitmap)` уже уничтожает объект:** Когда ты вызываешь `DeleteObject(hBitmap)`, система освобождает ресурсы, занятые `hBitmap`. Это означает, что объект больше не используется и не нуждается в дополнительном освобождении.
* **`SelectObject(HDCMem, oldBitmap)` не удаляет старый объект:** Эта функция просто возвращает предыдущий объект в контекст устройства. Она не уничтожает его.

**Однако, есть несколько нюансов:**

* **MSDN:** В MSDN действительно написано, что не следует удалять объект рисунка, пока он выбран в контроллере домена. Но в твоем случае ты сразу же удаляешь `hBitmap` после его использования, поэтому это правило не нарушается.
* **Утечка ресурсов:** Утечка ресурсов в этом контексте означает, что система не может освободить ресурсы, занятые `hBitmap`. Если бы это было так, ты бы заметил увеличение потребления памяти или замедление работы приложения.
* **Диспетчер задач:** Диспетчер задач показывает только общее количество GDI объектов. Он не отслеживает конкретные объекты и не может сказать точно, сколько из них еще используется.

**Вывод:**

В твоем случае вызов `SelectObject(HDCMem, oldBitmap)` не является строго обязательным. Однако, если ты хочешь быть уверенным в правильной работе кода и избежать непредвиденных проблем, то можешь оставить его в коде.

**Дополнительные рекомендации:**

* **Протестируй код:** Попробуй удалить вызов `SelectObject(HDCMem, oldBitmap)` и запустить приложение. Если все работает корректно, то ты можешь убрать его из кода.
* **Прочитай документацию:** Если ты хочешь узнать больше о работе с GDI объектами, то прочитай документацию Microsoft по соответствующим функциям.

Надеюсь, это помогло тебе разъяснить ситуацию!
Black Мыслитель (5645) 3 месяца назад
Вызов SelectObject(HDCMem, oldBitmap); необходим. Это позволяет вернуть старый объект в контекст устройства, предотвращая утечки ресурсов. Без этого могут возникнуть проблемы, не сразу заметные в диспетчере задач. Утечка ресурсов может проявиться в более длительном использовании программы или в других системах с разной конфигурацией. Всегда следует возвращать старые объекты перед удалением, чтобы соблюсти правильное управление ресурсами GDI.
Похожие вопросы