|
4 / 4 / 2
Регистрация: 13.11.2014
Сообщений: 108
|
||||||||||||||||
Освобождение памяти после статических переменных27.09.2023, 11:17. Показов 3717. Ответов 55
Всем доброго времени суток)
Знааю знаю, избитая тема, но всё-таки хотелось бы прочесть что-то конкретное по этому поводу и вообще получше понять как это работает. В общем и целом имеем на борту под виртуалкой "Centos 7" с "GCC 4.8.5" (поддерживается максимум C++14 стандарт) компилятором и пытаемся сделать так, чтобы у нас после выполнения функции произошло высвобождение памяти, которая ей выделилась. Потому-что перед стартом функции мы имеем в ОП 168 Кб, а после уже все 30 Мб. Хотелось бы как-то устранить это досадное недоразумение, ведь если и дальше так выстраивать работу программы, то после пары десятков вызовов различных ёмких функций у неё же никаких ресурсов ОП не хватит( Собстно вот код для примера в main.cpp: Кликните здесь для просмотра всего текста
Компилим всё это дело в командной строке:
А то что мы там увидим прикреплено в картинках в приложении. Была естественно догадка, что это всё освободится, если чем-то забить память другим, НО чуда увы не произошло( Там вообще после 4Гб всё в своп полезло и стало хорошо подтормаживать, а 30Мб как были, так и остались на месте. Да я конечно знаю про указатели и delete, НО мне интересно, а как в этом случае освобождать память? //которая ещё и по идее сама должна была освободиться после выполнения функции, но чуда не произошло, да и вообще не предвидится на горизонте( _ Да и вообще с чем связано такое поведение? Это особенности C++14 или так моя версия GCC с ним работает или это ещё всё и вкупе на не самой новой CentOS7? Откуда вообще у такого поведения ноги растут и как с этим бороться?
0
|
||||||||||||||||
| 27.09.2023, 11:17 | |
|
Ответы с готовыми решениями:
55
Выделение и освобождение памяти для локальных переменных функций
Освобождение памяти после std:bind |
|
4 / 4 / 2
Регистрация: 13.11.2014
Сообщений: 108
|
|||
| 28.09.2023, 18:54 [ТС] | |||
|
Добавлено через 1 минуту Но в целом я об этом думал, но хочется вообще понять в чём проблема, чтоб потом опять об такое не споткнуться.
0
|
|||
|
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
|
||
| 28.09.2023, 18:56 | ||
|
Но одно понятно в любом случае, подход, который вы выбрали поверхностный и скорее всего не решит вопрос нормально. Хотите развивать тему с освобождением памяти в систему - берите аллокатор сторонний (тот же jemalloc) и играйтесь с его настройками. Телодвижения внутри программы на это повлиять могут только косвенно. Той же фрагментацией управлять можно только настраивая сам аллокатор.
0
|
||
|
4 / 4 / 2
Регистрация: 13.11.2014
Сообщений: 108
|
||
| 28.09.2023, 18:58 [ТС] | ||
|
Там не только голимые подключения к БД, но и к API и их большинство, короче готовое решение точно не подойдёт. А вот это решение я бы таки улучшил, потому-что нууу да допустим я выкинул синхру в отдельный процесс, который потом тушить буду, НОО тогда мы вполне можем получить, что прога будет не по 50-100 Мб в сутки отжирать, а по 10-50 Кб, НО всё равно систематично отжирать каждый спотыкаясь на какой-либо функции. И увидим мы это только через год. Т.е. проблема всё равно никуда не исчезла( Короче надо бы сейчас разобраться почему так.
0
|
||
|
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
|
|||
| 28.09.2023, 19:01 | |||
|
Я вам пытаюсь обяснить, что так не делаются дела и придется поработать. Как поработать уже выше написал.
0
|
|||
|
4 / 4 / 2
Регистрация: 13.11.2014
Сообщений: 108
|
|||
| 28.09.2023, 19:04 [ТС] | |||
|
Ну даже допустим мне вообще тупо понравятся вектора и удобство их использования, а при их использовании вот такая вот крокозябра выскакивает нуу и что мне тогда с ними делать? Тут же чисто принципиальный вопрос. Добавлено через 1 минуту
0
|
|||
|
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
|
|||
| 28.09.2023, 19:31 | |||
|
Добавлено через 20 минут КиберСталкер21, еще раз, если у вас как-то подругому отработал тестовый пример в этой теме (не вернул память системе), то вопросы по поводу этого нужно задавать аллокатору. Включить у него профилирование и посмотреть логи. Там станет понятно почему. Насиловать программу и валить всю вину на std::string не нужно, он тут не при чем.
0
|
|||
|
4 / 4 / 2
Регистрация: 13.11.2014
Сообщений: 108
|
|
| 28.09.2023, 22:32 [ТС] | |
|
нуу ok, аллокатору так аллокатору)
Лаадно, как нибудь залезем и в него) а пока вроде некоторое временное решение есть, жить будем) Хотя конечно интересно почему у вас освобождал память, а у меня нет... эхх как же хочется сейчас понастальгировать, что CentOS7 вроде как-будто вчера было и как сейчас помню на её основе только, только начали в гос.секторах внедрять какую-то шляпу ![]() А уже все обновились на столь далеко, что и уследить не успеваешь) Мдеемс я даже без понятия когда мне удастся уговорить их там обновить сервер на что-то новое. Хотелось бы уже за всем новым работать, а то домашние проекты хоть не пиши вовсе, т.к. потом приходишь на работу и "аааа капец, да чтож тут такое всё тормознутое да старое, то этого нет, то того ещё" ![]() Наверняка проблема в каком-то старом бинарнике, который фиг обновишь в системе и повсеместно в микросервисах всех используемых. Докопаться до него - это будет то ещё приключение как мне кажется) А пока даже нейросети как я их не мучал вопросами, не колятся по этому поводу) Но тема мне всё-таки интересна, так что не бросаю. Как найду отпишусь в чём проблема была)
0
|
|
|
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
|
||
| 29.09.2023, 00:13 | ||
|
КиберСталкер21,
https://github.com/jemalloc/je... ng-Started https://github.com/jemalloc/je... k-Checking https://github.com/jemalloc/je... -Profiling https://github.com/jemalloc/je... /TUNING.md Добавлено через 11 минут Если будут проблемы с использованием сторонней jemalloc, то можно воспользоваться glibc-шной mtrace для минимального профилирования https://man7.org/linux/man-pag... ace.3.html
1
|
||
|
4 / 4 / 2
Регистрация: 13.11.2014
Сообщений: 108
|
||||||||||||
| 11.10.2023, 17:03 [ТС] | ||||||||||||
|
Пробовал с помощью glibc-шной mtrace и jemalloc потом, но мне как-то сложно, если честно, разобраться что показывают цифры и как по ним судить что происходит под капотом у программы( Для начала попробовал с mtrace ну и прога имела такой вид: Кликните здесь для просмотра всего текста
Далее компилим и вызывает трассировку:
Добавлено через 36 минут //тээкс, а текст тут такой не прикрепить?( Добавлено через 48 секунд Кликните здесь для просмотра всего текста
Memory not freed: ----------------- Address Size Caller 0x00000000024d0460 0x100 at ??:? 0x00000000024d06e0 0x64 at ??:? 0x00000000024d0790 0x64 at ??:? 0x00000000024d0840 0x64 at ??:? 0x00000000024d08f0 0x64 at ??:? 0x00000000024d09a0 0x64 at ??:? 0x00000000024d0a50 0x64 at ??:? 0x00000000024d0b00 0x64 at ??:? 0x00000000024d0bb0 0x64 at ??:? 0x00000000024d0c60 0x64 at ??:? 0x00000000024d0d10 0x64 at ??:? 0x00000000024d0dc0 0x64 at ??:? 0x00000000024d0e70 0x64 at ??:? 0x00000000024d0f20 0x64 at ??:? 0x00000000024d0fd0 0x64 at ??:? 0x00000000024d1080 0x64 at ??:? 0x00000000024d1130 0x64 at ??:? 0x00000000024d11e0 0x64 at ??:? 0x00000000024d1290 0x64 at ??:? 0x00000000024d1340 0x64 at ??:? 0x00000000024d13f0 0x64 at ??:? 0x00000000024d14a0 0x64 at ??:? 0x00000000024d1550 0x64 at ??:? 0x00000000024d1600 0x64 at ??:? 0x00000000024d16b0 0x64 at ??:? 0x00000000024d1760 0x64 at ??:? 0x00000000024d1810 0x64 at ??:? 0x00000000024d18c0 0x64 at ??:? 0x00000000024d1970 0x64 at ??:? 0x00000000024d1a20 0x64 at ??:? 0x00000000024d1ad0 0x64 at ??:? 0x00000000024d1b80 0x64 at ??:? 0x00000000024d1c30 0x64 at ??:? 0x00000000024d1ce0 0x64 at ??:? 0x00000000024d1d90 0x64 at ??:? 0x00000000024d1e40 0x64 at ??:? 0x00000000024d1ef0 0x64 at ??:? 0x00000000024d1fa0 0x64 at ??:? 0x00000000024d2050 0x64 at ??:? 0x00000000024d2100 0x64 at ??:? 0x00000000024d21b0 0x64 at ??:? 0x00000000024d2260 0x64 at ??:? 0x00000000024d2310 0x64 at ??:? 0x00000000024d23c0 0x64 at ??:? 0x00000000024d2470 0x64 at ??:? 0x00000000024d2520 0x64 at ??:? 0x00000000024d25d0 0x64 at ??:? 0x00000000024d2680 0x64 at ??:? 0x00000000024d2730 0x64 at ??:? 0x00000000024d27e0 0x64 at ??:? 0x00000000024d2890 0x64 at ??:? 0x00000000024d2940 0x64 at ??:? 0x00000000024d29f0 0x64 at ??:? 0x00000000024d2aa0 0x64 at ??:? 0x00000000024d2b50 0x64 at ??:? 0x00000000024d2c00 0x64 at ??:? 0x00000000024d2cb0 0x64 at ??:? 0x00000000024d2d60 0x64 at ??:? 0x00000000024d2e10 0x64 at ??:? 0x00000000024d2ec0 0x64 at ??:? 0x00000000024d2f70 0x64 at ??:? 0x00000000024d3020 0x64 at ??:? 0x00000000024d30d0 0x64 at ??:? 0x00000000024d3180 0x64 at ??:? 0x00000000024d3230 0x64 at ??:? 0x00000000024d32a0 0x64 at ??:?
0
|
||||||||||||
|
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
|
|
| 11.10.2023, 17:03 | |
|
КиберСталкер21, файлом во вложении (лучше в архиве).
0
|
|
|
4 / 4 / 2
Регистрация: 13.11.2014
Сообщений: 108
|
|||||||||||
| 11.10.2023, 17:04 [ТС] | |||||||||||
|
нуу хоть так, если что могу дать расширенную версию, а то её не дали прикрепить
Добавлено через 25 секунд Я как бы понимаю, что это что-то связанное с адресами памяти или их размерами, даже расчитал немного дельт между ними, и вроде бы да даже сходится. Нуу и что с этого? Т.е. я вижу как память выделяется, но я не вижу с чего вдруг это происходит и для чего? Т.е. мне нужно по идее понять как аллокатор у меня производит выделение и высвобождение памяти, например что-то, что указывало бы на вызов free или что-то ещё, но я тут вообще не понимаю к чему эти цифры( Как вообще из них можно понять, что что-то подобное происходит где-то? ...ok пошёл дальше попробовал скачать, скомпилить и установить jemalloc. И код немного преобразовывается в нечто такое: Кликните здесь для просмотра всего текста
Ну и собираем и выплёвываем инфу:
0
|
|||||||||||
|
4 / 4 / 2
Регистрация: 13.11.2014
Сообщений: 108
|
|
| 11.10.2023, 17:12 [ТС] | |
|
Во вложении
0
|
|
|
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
|
|
| 11.10.2023, 17:12 | |
|
КиберСталкер21,
У jemalloc есть визуализатор. Лучше им пользоваться. Программу кстати пересобирать с ним не обязательно, можно в runtime подменить. https://www.tinybird.co/clickh... h-jemalloc
1
|
|
|
4 / 4 / 2
Регистрация: 13.11.2014
Сообщений: 108
|
|
| 11.10.2023, 17:13 [ТС] | |
|
0
|
|
|
4 / 4 / 2
Регистрация: 13.11.2014
Сообщений: 108
|
||
| 11.10.2023, 17:15 [ТС] | ||
|
И я опять вижу кучу цифр и прочего. И я даже понимаю что они могут обозначать и к чему привязаны, НО я ни разу не возьму в толк как это можно соотнести к схеме работы аллокатора с векторами у меня под капотом?
Добавлено через 38 секунд Возможно сегодня не успею, но обязательно попробую
0
|
||
|
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
|
|
| 11.10.2023, 17:19 | |
|
КиберСталкер21, еще, если у вас доступен valgrind, то можно воспользоваться его утилитой massif. И к ней тоже есть визуализатор, называется, если правильно помню, massif visualizer
https://apps.kde.org/ru/massif-visualizer/
1
|
|
| 11.10.2023, 17:19 | |
|
Освобождение памяти после динамического массива Освобождение памяти после использования трёхмерного массива
Резервирование памяти/освобождение памяти для трехмерного массива Избавиться от статических переменных Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
|
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ
Основная суть и тезисы по измерениям:
0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема.
Объект не может перемещаться в 0D.
1D (Первое измерение):. . .
|