Почему «нет необходимости освобождать ресурсы, загруженные с помощью LoadResource» для 32-разрядных приложений Windows?

#winapi

#winapi

Вопрос:

В функции FreeResource — Microsoft Docs:

[Эта функция устарела и поддерживается только для обратной совместимости с 16-разрядной Windows. Для 32-разрядных приложений Windows нет необходимости освобождать ресурсы, загруженные с помощью LoadResource. При использовании в 32 или 64-разрядных системах Windows эта функция вернет значение FALSE .]

Почему это? Это потому, что память большая?

Комментарии:

1. Это связано с тем, что дескрипторы ресурсов и других типов гораздо более доступны, а также с тем, что при закрытии приложения Windows в любом случае освободит эти ресурсы для вас. Однако в качестве хорошей практики я обязательно освобождаю все выделяемые мной ресурсы, чтобы любые отмеченные утечки означали, что это проблема.

2. @KenWhite Спасибо тебе. В моей программе есть некоторые ресурсы, которые не нужны после инициализации, и я хотел бы освободить их, чтобы сэкономить память.

3. @Кен Неправда. В 16-разрядной версии Windows LoadResource приводил к распределениям, которые необходимо было сбалансировать освобождениями. В Win32 ресурсы сопоставляются, и LoadResource не требует каких-либо распределений.

4. @DavidHeffernan В этом суть — файлы ресурсов отображаются в память. Я этого не делал, теперь я понял.

Ответ №1:

Специализированные функции, зависящие от ресурсов, такие как LoadBitmap() «постобработка» фактического ресурса в полезный объект GDI, который потребляет как дополнительную память, так и слот в общесистемной таблице GDI (ограничено 64 КБ дескрипторов). Из-за этого необходимо вызвать DeleteObject() после завершения работы с HBITMAP , чтобы освободить связанные ресурсы.

В отличие от LoadBitmap() (и в отличие от 16-разрядной Windows), LoadResource() не выделяет никаких дополнительных ресурсов в Win32, а скорее «указывает» на ресурс в отображенном в память образе уже загруженного модуля. Следовательно, в Win32 нечего FreeResource() очищать.

Цитирую из книги Раймонда Чена В чем разница между FreeResource и, скажем, DestroyAcceleratorTable:

В 16-разрядной Windows загрузка ресурса повлекла за собой выделение фрагмента памяти, а затем заполнение этого блока памяти из образа диска. В Win32 ресурсы отображаются в адресное пространство как часть образа; нет выделения памяти и явной загрузки.