dlopen и dlclose управление памятью в C appln - PullRequest
1 голос
/ 31 октября 2011

Я использую dlopen для загрузки динамической библиотеки, например, «lib1.so», и вызываю одну из открытых функций, скажем, A1, Функция A1 выделяет динамическую память размером 100 КБ, используя malloc, но не освобождает ее, в основной функции снова я все dlclose. [dlopen, вызов функции A1, dlclose]

Я повторяю шаг, скажем 10 раз, Purify сообщает об этом как утечка памяти в 1000 КБ , сообщает valgrind Косвенно потерял 1000KB.

Не могли бы вы предложить 100 КБ * 10 раз = 1000 КБ, это реальная утечка памяти? Как я назвал dlclose, вся память, выделенная для динамических библиотек, автоматически освобождается когда мы называем dlclose?

ОС: Linux Программирование LAN: C

Ответы [ 3 ]

5 голосов
/ 31 октября 2011

dlclose не освобождает память, выделенную malloc.Это только освобождает статические переменные, объявленные в библиотеке.Вы должны явно освободить любую выделенную память в своей библиотеке, возможно, в функции _fini.

3 голосов
/ 31 октября 2011

Страница man для dlclose ничего не говорит об освобождении памяти, когда она вызывается.

dlclose()
   The  function  dlclose()  decrements the reference count on the dynamic
   library handle handle.  If the reference count drops  to  zero  and  no
   other  loaded  libraries use symbols in it, then the dynamic library is
   unloaded.

   The function dlclose() returns 0 on success, and nonzero on error.

Без магии.

Если вы используете Linux, вы можете попробовать этот метод , чтобы обернуть malloc () и отслеживать выделенную память.

2 голосов
/ 31 октября 2011

Нет, память восстанавливается при завершении процесса, а не при закрытии динамических библиотек.

...