Библиотека DLL/SO, как память библиотеки связана с вызывающим процессом?

Я читал, что вся память процесса освобождается ОС, когда процесс завершается (любым образом), поэтому отпадает необходимость вызывать каждый dtor по очереди.

Теперь мой вопрос: как память DLL или SO связана с очисткой выделенной памяти?

Я спрашиваю, потому что я, вероятно, в конечном итоге буду использовать Java и/или C# для вызова DLL C++ с некоторыми статическими функциями стиля C, которые будут выделять объекты C++ в куче. Извините, если я увлекся сравнением кучи и стека, я чувствую, что упустил из виду концепцию _кучи_ (т.е. только одной).

Любые другие потенциальные ловушки для утечек памяти при использовании библиотек?


person John    schedule 28.08.2011    source источник


Ответы (2)


Библиотека становится частью процесса при ее загрузке. Что касается приведения в порядок памяти, дескрипторов, ресурсов и т.д., то система не различает, были ли они созданы в исполняемом образе или в библиотеке.

person David Heffernan    schedule 28.08.2011

Вам не о чем беспокоиться. Об этом позаботится загрузчик операционной системы.

Как правило, разделяемые библиотеки становятся видимыми в адресном пространстве вашего процесса посредством сопоставления памяти (все выполняется загрузчиком), а ОС отслеживает, скольким процессам все еще требуется данная разделяемая библиотека. Данные о состоянии, которые необходимы отдельно для каждого процесса, обычно обрабатываются методом копирования при записи, поэтому нет опасности, что ваша криптобиблиотека может случайно использовать ключ другого процесса :-) Короче говоря, не беспокойтесь.

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

person Kerrek SB    schedule 28.08.2011