Удаление функций C++

66
12 апреля 2021, 19:40

Если функция является зарезервированным набором команд в памяти, то могу ли я её удалить? Если да, то как?

Answer 1

Удалить функцию (кусок кода, то есть зарезервированный набор команд в памяти) из этой самой памяти вполне возможно. Но, как тут уже справедливо указали коллеги, таких механизмов непосредственно в языке С++ не предусмотрено. К счастью, такие механизмы обычно предусмотрены в операционных системах. В частности, во всеми любимой операционной системе Windows, предусмотрен механизм загрузки и выгрузки так называемых dll (dynamic link library).

Таким образом, если Вам надо попользоваться функцией, а потом удалить ее из памяти, то Вы должны (для OC Windows):

  1. Поместить функцию в dll (создать dll)
  2. Загрузить эту dll в своем приложении с помощью LoadLibrary
  3. Получить адрес функции с помощью GetProcAddress
  4. Поработать с функцией (вызвать ее)
  5. Выгрузить dll с помощью FreeLibrary

UPD1:

Тут коллеги спрашивают, зачем может понадобится удалять часть кода из памяти. Конечно, по нынешним временам мы избалованы изобилием ОЗУ и забыли страшное слово "оверлеи", хорошо знакомое тем, кто начинал во времена MS DOS. Но вполне можно представить себе ситуацию и сейчас, когда кода много, а используется он в режиме или/или. То есть после запуска программы и выбора режима работы пользователем приложение загружает нужную DLL и работает. После окончания работы DLL выгружается и приложение ждет выбора нового режима работы.

UPD2:

В связи с этим возникает интересный вопрос о фрагментации уже не кучи, а фрагментации области кода (по аналогии с фрагментацией кучи). Вполне возможно представить себе ситуацию, когда после долгой работы много загруженных и выгруженных маленьких DLL разобъют область кода на части и система не сможет загрузить большую DLL, несмотря на то, что общий размер свободной области будет превышать размер большой DLL.

Answer 2

С точки зрения языка C++ — нет, такого механизма не предусмотрено.

С точки зрения большинства реализаций — это гипотетически возможно, в зависимости от того что именно понимать под термином «удалить функцию», но довольно сложно и не имеет за собой особого практического смысла. Общая идея состоит в том чтобы во время исполнения затереть или заменить на заглушку область памяти на которую ссылается функция. т.к на большинстве современных платформ область памяти с исполняемым кодом защищена от записи, то придётся аллоцировать новую область память, копировать туда содержимое текущей, изменяя нужный участок, а потом переподключать её по старым адресам.

READ ALSO
HTML: готовый список шрифтов

HTML: готовый список шрифтов

Есть ли готовый список шрифтов для html страницы, что бы можно было подключить в несколько строчек кода? Под список шрифтов я имею ввиду выпадающий...

84
Как сформировать html-ссылку для Viber?

Как сформировать html-ссылку для Viber?

Устанавливаю на сайт кнопку (html-ссылка) для запуска чата в Viber:

166
Не отображаются данные базы данных ms sql в Visual Studio

Не отображаются данные базы данных ms sql в Visual Studio

Я совсем начинающий, столкнулся с проблемой, решение которой найти в поиске не смог

99
Аналог структуры C++ с битовыми полями в C#

Аналог структуры C++ с битовыми полями в C#

Объясните, выделяется размер для следующей структуры

116