Пишу приложение для FreeBSD на C с компилятором gcc. Возникла проблема с не освобождающейся памятью. free(malloc(...)) не отдает память системе. Тут http://c-faq.com/malloc/freetoOS.html нашел следующее: Что-то в этом есть, но когда прога отъедает несколько гигабайт оперативки при этом оперируя всего несколькими мегабайтами это лично мне действует на нервы Есть ли возможно действительно вернуть память системе? Программа разрабатывается конкретно под указанную линейку (7.1 ia64), так что приму частные решения для данной системы. Решения со "своим менеджером памяти" не пойдут - все равно надо память возвращать. Заранее спасибо.
Откуда мнение, что не отдаёт? В линукс оппортунистическое выделение памяти - физическая память резервируется при первом обращении.
top, ps и free говорят о постоянном увеличении потребляемой программой памяти. Дошло до того, что во всех местах выделения и освобождения памяти добавил счетчик выделенной памяти. Он не показывает утечек.
Увы, до понедельника никак. С работы смогу тут выложить куски кода. Просто особо интересна приведенная мною фраза о не возвращаемой libc памяти в систему, о повторном ее возможном использовании в будущем. Как-то слишком самовольно поступает.
тоже самое, освобождает сразу после free() на amd64 linux, если бы не освобождало то аппликуха бы загнулась в свопе, а так calloc,malloc,realloc,free держат в тонусе...
Xerx Написать свой хип для больших объектов. Или для всех объектов вообще. Для всех объектов вообще можно на cbreak'е это сделать, но libc может неявно пользоватся malloc/free в некоторых ситуациях. Если же миксовать cbreak с malloc/free, то я затрудняюсь сказать можно ли как-то не убить libc'овый хип. А можно использовать mmap на /dev/null, тут уж я думаю без проблем можно будет использовать и malloc/free для множественных выделений, и самостоятельно выделять/освобождать память под большие объекты. Но вообще, мне чего-то не нравится проблема. С фрёй я мало работал, но... Но в ней же крутится весь тот софт, который работает в линухе. И у него проблем не возникает. Думается мне, что ты что-то не так делаешь. Возьми mem-leak детектор, зачем изобретать велосипед? Засунь в valgrind, например, тот пишет про мемлики.
Хы. А я думаю чего это форум так надолго задумался, когда я на кнопку "отправить" нажал. А он оказывается два сообщения сразу добавлял.
Проблема оказалась в другом и вообще не связано с оперативкой напрямую В процессе работы создается много потоков через pthread_create. При этом память и растет. Вызов pthread_detach() решил проблему. Вот такие дела...