LINUX.ORG.RU

Linux C++ free memory after dealocation

 , , , ,


1

5

Привет форумчане. Странные вещи творятся в с++ и системе.

Если контейнер(такой чтоб лежал последовательно в памяти) наполнить то память естественно вырастет. Но если потом даже удалить из контейнера все элементы, то потребление памяти не снижается. Если проверить память дважды, то на второй раз потребление памяти незначительно снижается на некоторых контейнерах. Оно понятно, что plain контейнеры резервирую память на будующее для уменьшения аллокаций. Но даже если контейнеру сделать swap с пустым, то потребление памяти всё равно не уменьшается. Смею предположить, что это ещё какая-то системная фича, мол если процесс затребовал себе гектар, потом освободил его, то система не забирает его сразу обратно, мало-ли ещё понадобится. Я сделал такой вывод ещё потому, что даже если выделаю через new много памяти, то после delete освобождается только половина.

Мои потуги можно увидеть тут https://github.com/LuxoftAKutsan/TestsAndResearch/tree/master/free_memory_smo...

Вопросы к форумчанам :

1) Где почитать матчасть по этой теме.

2) Может я лажаю в коде и у меня реальные утечки?

3) Как бы заставить систему вернуть себе более не используемую мной память.



Последнее исправление: dokihot (всего исправлений: 2)
Ответ на: комментарий от DarkEld3r

Вы же сами выше привели пример с shrink_to_fit.

Ну и каждого компилятора/ОС свои реализации, что совсем не радует.

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

Вы же сами выше привели пример с shrink_to_fit.

Это, конечно, неприятно, но вполне логично. Мало ли какой там системный аллокатор окажется - если он не захочет память отдавать, то что shrink_to_fit сделать может?

Да и в пределах Qt тоже не всегда получается оставаться - не даром же у них имеется возможность добраться до нижележащей реализации.

Ну и если есть ещё примеры, то было бы интересно их услышать.

DarkEld3r ★★★★★
()
Последнее исправление: DarkEld3r (всего исправлений: 1)
Ответ на: комментарий от DarkEld3r

не даром же у них имеется возможность добраться до нижележащей реализации

Это у каких классов/контейнеров? В большинстве случаев вся реализация приколочена намертво, что иногда тоже не очень удобно.

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

Это у каких классов/контейнеров?

Для контейнеров (наверное) нет. Зато есть всякие nativeEvent, winId и т.д. Ну и плюс разные дефайны для определения платформы.

DarkEld3r ★★★★★
()
Ответ на: комментарий от DarkEld3r

Ну это не контейнеры. И нужно оно только для доступа к ОС-специфичным вещам.

Если брать классы, которые пересекаются с std - то тут всё залоченно полностью. В угоду удобства использования. Ну и надёжности.

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

Ну и каждого компилятора/ОС свои реализации

...зачастую заточенные под особенности оптимизатора и интринсики конкретного компилятора

annulen ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.