#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 ресурсы отображаются в адресное пространство как часть образа; нет выделения памяти и явной загрузки.