|
4 / 4 / 2
Регистрация: 13.11.2014
Сообщений: 108
|
||||||||||||||||
Освобождение памяти после статических переменных27.09.2023, 11:17. Показов 4027. Ответов 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 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||
| 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 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|||
| 28.09.2023, 19:01 | |||
|
Я вам пытаюсь обяснить, что так не делаются дела и придется поработать. Как поработать уже выше написал.
0
|
|||
|
4 / 4 / 2
Регистрация: 13.11.2014
Сообщений: 108
|
|||
| 28.09.2023, 19:04 [ТС] | |||
|
Ну даже допустим мне вообще тупо понравятся вектора и удобство их использования, а при их использовании вот такая вот крокозябра выскакивает нуу и что мне тогда с ними делать? Тут же чисто принципиальный вопрос. Добавлено через 1 минуту
0
|
|||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|||
| 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 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||
| 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 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|
| 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 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|
| 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 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|
| 11.10.2023, 17:19 | |
|
КиберСталкер21, еще, если у вас доступен valgrind, то можно воспользоваться его утилитой massif. И к ней тоже есть визуализатор, называется, если правильно помню, massif visualizer
https://apps.kde.org/ru/massif-visualizer/
1
|
|
| 11.10.2023, 17:19 | |
|
Освобождение памяти после динамического массива Освобождение памяти после использования трёхмерного массива
Резервирование памяти/освобождение памяти для трехмерного массива Избавиться от статических переменных Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version
1. 2003 - 06 - Designing Virtual Worlds (1st Edition)
Автор: Richard A. Bartle | Объем: 768 стр.
Ссылки: Amazon
. . .
|
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
|
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы.
Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
|
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version
Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
|
|
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров".
Задача:
Запрет инициалов.
Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
|
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . .
Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
|
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг.
Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует.
В процессе разработки. . .
|
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
|