Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
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:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <vector>
 
#include <chrono>
#include <thread>
 
//небольшая функция, которая должна будет у нас стартануться через секунд 25 в основном теле программы
//отработать своё и успешно свалить в закат
int test_load_OP()
{
    int ik_ = 655357; //даём размерность будущего вектора, достаточно большую, 
    //чтоб мы могли точно увидеть разницу в ОП
    std::vector<std::string> hexCh; //для полного счастья у нас ещё и вектор типа string,
    //чтоб побольше неоптимальным образом занять ОП
 
    for (int i = 0; i < ik_; i++)
    {   //забиваем вектор всякой ерундой
        hexCh.push_back("sdf574 " + std::to_string(ik_));
    }
    //hexCh.resize(1); //тут мы уже просто пробовали по разному высвобождать память как вы видели
    //hexCh.clear(); //но ничего из этого увы не сработало
    //std::vector<std::string>().swap(hexCh);
    hexCh.clear();
    hexCh.shrink_to_fit();
    //malloc_trim(0);
    return 1;
}
 
int main(int argc, char* argv[])
{   //теперь в основном теле программы имитируем некоторую жизнедеятельность
    // и по умолчанию сначала выводим Hello word!
    //чтоб хотя-бы в консоли понимать, что она запустилась
    std::cout << "Hello word!" << std::endl;
    int irt = 0;
    while (irt < 5)
    {   //далее немного подождём, т.к. нам ещё надо в системный монитор заглянуть успеть 
        //или htop, а лучше и туда и туда, и зафиксировать расход ОП
        irt++;
        std::this_thread::sleep_for(std::chrono::milliseconds(5000));
    }
    int res_run_LoadOP = test_load_OP(); //Ok теперь пускаём имитацию отработки дорогой функции
    int ipewq = 5;
    //нуу и теперь небольшая имитация жизнедеятельности дальнейшей программы
    // пока мы не нажмём Ctrl+C в консоли
    //чтоб прекратить это безобразие)
    //а заодно пока оно идёт фиксируем увеличение ОП визуально)
    while (true)
    {
        ipewq++;
        ipewq--;
    }
    return 0;
}

Компилим всё это дело в командной строке:
Bash
1
g++ -std=c++1y main.cpp
И далее запускаем:
Bash
1
./a.out
И бежим в системный монитор, а заодно ещё открываем новое окно консоли с htop, находим везде наш процесс и начинаем бдить за сжиранием ОП.
А то что мы там увидим прикреплено в картинках в приложении.
Была естественно догадка, что это всё освободится, если чем-то забить память другим, НО чуда увы не произошло( Там вообще после 4Гб всё в своп полезло и стало хорошо подтормаживать, а 30Мб как были, так и остались на месте.
Да я конечно знаю про указатели и delete, НО мне интересно, а как в этом случае освобождать память?
//которая ещё и по идее сама должна была освободиться после выполнения функции, но чуда не произошло, да и вообще не предвидится на горизонте(
_
Да и вообще с чем связано такое поведение? Это особенности C++14 или так моя версия GCC с ним работает или это ещё всё и вкупе на не самой новой CentOS7? Откуда вообще у такого поведения ноги растут и как с этим бороться?
Миниатюры
Освобождение памяти после статических переменных   Освобождение памяти после статических переменных  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.09.2023, 11:17
Ответы с готовыми решениями:

Выделение и освобождение памяти для локальных переменных функций
Привет Столкнулся со следующей проблемой. Написал простенькое приложение: читаем 1 строку из файла на диске, записываем 1 строку в файл...

Освобождение памяти после виджета
в конструкторе класса для выравнивания кнопок по сетке пришлось создать виджет (динамически). вопрос в том надо лит выделенную под него...

Освобождение памяти после std:bind
Что имею: - CentOS - gcc 4.8 - valgrind Что делаю - С помощью valgrind устраняю утечки - Если приложение остановлено...

55
4 / 4 / 2
Регистрация: 13.11.2014
Сообщений: 108
28.09.2023, 18:54  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от DrOffset Посмотреть сообщение
Т.е. ваша рабочая программа выделяет огромный вектор строк и затем держит его в памяти?
...вектора, если быть более точным и не в одной функции, а во многих, которые после отработки должны были уйти, а сами сидят в ОП мёртвым грузом - нуу и как от него избавиться?

Добавлено через 1 минуту
Цитата Сообщение от Алексей1153 Посмотреть сообщение
можно попробовать запускать эту синхронизацию в виде отдельного процесса
Там не всё так просто(
Но в целом я об этом думал, но хочется вообще понять в чём проблема, чтоб потом опять об такое не споткнуться.
0
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
28.09.2023, 18:56
Цитата Сообщение от КиберСталкер21 Посмотреть сообщение
Почему без экспертизы нельзя всё нормально делать? Она к чему там ещё?
К тому, что я понятия не имею что у вас там делается. Правильно вы сюда транслируете информацию, неправильно. Верно вы определили причну или неверно. Эспертиза нужна для того, чтобы вам что-то конкретнео советовать. Мы все, кто тут в этой теме сидит, должны знать кишки вашего проекта, чтобы вам помочь. Вот что такое экспертиза. Ясно это или нет?

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

Хотите развивать тему с освобождением памяти в систему - берите аллокатор сторонний (тот же jemalloc) и играйтесь с его настройками. Телодвижения внутри программы на это повлиять могут только косвенно. Той же фрагментацией управлять можно только настраивая сам аллокатор.
0
4 / 4 / 2
Регистрация: 13.11.2014
Сообщений: 108
28.09.2023, 18:58  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Ну вот и выкиньте ее нафиг, и возьмите какое-нибудь готовое решение для организации кэша
Эммм, там не всё так просто)
Там не только голимые подключения к БД, но и к API и их большинство, короче готовое решение точно не подойдёт.
А вот это решение я бы таки улучшил, потому-что нууу да допустим я выкинул синхру в отдельный процесс, который потом тушить буду, НОО тогда мы вполне можем получить, что прога будет не по 50-100 Мб в сутки отжирать, а по 10-50 Кб, НО всё равно систематично отжирать каждый спотыкаясь на какой-либо функции. И увидим мы это только через год.
Т.е. проблема всё равно никуда не исчезла(
Короче надо бы сейчас разобраться почему так.
0
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
28.09.2023, 19:01
Цитата Сообщение от КиберСталкер21 Посмотреть сообщение
Давайте по существу - вот есть вектора с string, они могу при многократных вызовах забивать ОП и swap (зафиксированно скринами) - как от этого избавиться?
Вектор, когда вызвал свой деструктор и освободил все свои элементы больше не владеет памятью, которую занимал. Элементы (хоть int, хоть string) если были освобождены вектором (а они освобождаются) больше не владеют памятью, которую занимали. Если эта память по какой-то причине не отдана была системе после этого, а продолжает считаться занятой, то вопросы эти надо задавать аллокатору. Хотя, уже третий раз замечу, что скорее всего либо эта память не освобождается, потому что в коде утечка, либо не освобождается, потому что в алгоритме вашей "синхронизации" какой-то изъян. Найти его под силу только тем, кто в теме проекта, т.е. имеет экспертизу. Ясно?

Цитата Сообщение от КиберСталкер21 Посмотреть сообщение
По моему это вы просто убегаете от этой проблемы и хотите "перелить её в другой стакан"... не?)
А по-моему вы читаете через строчку, половину важной информации пропускаете и ждете волшебного решения на 3 строчки.
Я вам пытаюсь обяснить, что так не делаются дела и придется поработать.
Как поработать уже выше написал.
0
4 / 4 / 2
Регистрация: 13.11.2014
Сообщений: 108
28.09.2023, 19:04  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Правильно вы сюда транслируете информацию, неправильно.
Дык а даже если не правильно, то всё равно какая разница?
Ну даже допустим мне вообще тупо понравятся вектора и удобство их использования, а при их использовании вот такая вот крокозябра выскакивает нуу и что мне тогда с ними делать? Тут же чисто принципиальный вопрос.

Добавлено через 1 минуту
Цитата Сообщение от DrOffset Посмотреть сообщение
Хотя, уже третий раз замечу, что скорее всего либо эта память не освобождается, потому что в коде утечка
Ok, она не освобождается в коде из примере, где там утечка?
0
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
28.09.2023, 19:31
Цитата Сообщение от КиберСталкер21 Посмотреть сообщение
Ok, она не освобождается в коде из примере, где там утечка?
Я этот пример запускал и там все освобождается. После того как функция отработала системный монитор на моем линуксе показывал занятую память 187кб. И все.

Цитата Сообщение от КиберСталкер21 Посмотреть сообщение
Ну даже допустим мне вообще тупо понравятся вектора и удобство их использования, а при их использовании вот такая вот крокозябра выскакивает нуу и что мне тогда с ними делать? Тут же чисто принципиальный вопрос.
Это все равно что сказать, что вам нравится лопата, чтобы выкопать километровый угольный карьер и это принципиальный вопрос. Ну если не подходит вектор для этой задачи, что тут еще сказать? Не используйте вектор, используйте дерево какое-нибудь, наподобие как файловые системы делают. Вектор - это просто не то решение и все.

Добавлено через 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 минут
Цитата Сообщение от КиберСталкер21 Посмотреть сообщение
malloc_trim(0)
Кстати, если вы вызывали эту функцию и не получили никакого эффекта, то это потому что она у вас в неправильном месте. Ее целесообразно вызывать после того, как функция test_load_OP отработала, а не внутри функции. Потому что внутри функции память все еще занята, а вот после уже свободна (есть что тримить). Попробуйте вызвать ее в main.

Если будут проблемы с использованием сторонней 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  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Если будут проблемы с использованием сторонней jemalloc, то можно воспользоваться glibc-шной mtrace для минимального профилирования
Я таки добрался до того, чтобы отпрофилировать этот случай)
Пробовал с помощью glibc-шной mtrace и jemalloc потом, но мне как-то сложно, если честно, разобраться что показывают цифры и как по ним судить что происходит под капотом у программы(
Для начала попробовал с mtrace ну и прога имела такой вид:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <iostream>
#include <vector>
 
#include <chrono>
#include <thread>
 
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <stddef.h>
#include <malloc.h>
#include <mcheck.h>
 
typedef struct
{
    uint64_t Size,RSS,Shared,Text,Lib,Data,Dt;
}statm_t;
 
statm_t ReadStatm( void )
{
    statm_t R;
    FILE * StatmFile=fopen("/proc/self/statm","rt");
    fscanf(StatmFile,"%ld %ld %ld %ld %ld %ld %ld",&R.Size,&R.RSS,&R.Shared,&R.Text,&R.Lib,&R.Data,&R.Dt);
    fclose(StatmFile);
    return R;
}
 
 
void PrintMemUsage( const char * Where )
{
    statm_t Statm = ReadStatm();
    std::cout << "MemUsage: " << Where << " = " << (Statm.RSS * 4) << " kBytes" << std::endl;
}
 
 
int test_load_OP()
{
    int ik_ = 64;
    PrintMemUsage("After reserv vectors");
    std::vector<std::string> hexCh(ik_);
    PrintMemUsage("Before reserv vectors");
    for (int i = 0; i < ik_; i++)
    {
        hexCh[i] = "sdf574 " + std::to_string(i);
        malloc(100);
    }
    
    PrintMemUsage("After clear");
    hexCh.clear();
    PrintMemUsage("Before shrink");
    return 1;
}
 
int main(int argc, char* argv[])
{
    mtrace();
    int irt = 0;
    while (irt < 2)
    {
        irt++;
        std::this_thread::sleep_for(std::chrono::milliseconds(1000));
    }
    PrintMemUsage("Before load");
    int res_run_LoadOP = test_load_OP();
    PrintMemUsage("after load load");
    calloc(16, 16);
    return 0;
}

Далее компилим и вызывает трассировку:
Bash
1
2
3
4
$ g++ -std=c++1y main.cpp
$ export MALLOC_TRACE=/tmp/t
$ ./a.out
$ mtrace ./a.out $MALLOC_TRACE
В итоге выплёвывает вот такой вот большой текст:

Добавлено через 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. И код немного преобразовывается в нечто такое:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <iostream>
#include <vector>
 
#include <chrono>
#include <thread>
 
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <stddef.h>
 
#include <jemalloc/jemalloc.h>
 
typedef struct
{
    uint64_t Size,RSS,Shared,Text,Lib,Data,Dt;
}statm_t;
 
statm_t ReadStatm( void )
{
    statm_t R;
    FILE * StatmFile=fopen("/proc/self/statm","rt");
    fscanf(StatmFile,"%ld %ld %ld %ld %ld %ld %ld",&R.Size,&R.RSS,&R.Shared,&R.Text,&R.Lib,&R.Data,&R.Dt);
    fclose(StatmFile);
    return R;
}
 
 
void PrintMemUsage( const char * Where )
{
    statm_t Statm = ReadStatm();
    std::cout << "MemUsage: " << Where << " = " << (Statm.RSS * 4) << " kBytes" << std::endl;
}
 
 
int test_load_OP()
{
    int ik_ = 64;
    PrintMemUsage("After reserv vectors");
    std::vector<std::string> hexCh(ik_);
    PrintMemUsage("Before reserv vectors");
    for (int i = 0; i < ik_; i++)
    {
        hexCh[i] = "sdf574 " + std::to_string(i); //"sdf574 " + std::to_string(i);
    }
    
    PrintMemUsage("After clear");
    hexCh.clear();
    PrintMemUsage("Before shrink");
    return 1;
}
 
int main(int argc, char* argv[])
{
    int irt = 0;
    while (irt < 2)
    {
        irt++;
        std::this_thread::sleep_for(std::chrono::milliseconds(1000));
    }
    PrintMemUsage("Before load");
    int res_run_LoadOP = test_load_OP();
    PrintMemUsage("after load load");
 
    malloc_stats_print(NULL, NULL, NULL);
    return 0;
}

Ну и собираем и выплёвываем инфу:
Bash
1
2
$ g++ -std=c++1y main.cpp -L/usr/local/jemalloc/lib -I/usr/local/jemalloc/include -ljemalloc
$ ./a.out
И вываливается ещё больше цифорок):
0
4 / 4 / 2
Регистрация: 13.11.2014
Сообщений: 108
11.10.2023, 17:12  [ТС]
Во вложении
Вложения
Тип файла: txt jmalloc.txt (11.6 Кб, 9 просмотров)
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  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
файлом во вложении (лучше в архиве).
Вот ещё вложение по mtrace
Вложения
Тип файла: 7z mtrace.7z (769 байт, 3 просмотров)
0
4 / 4 / 2
Регистрация: 13.11.2014
Сообщений: 108
11.10.2023, 17:15  [ТС]
И я опять вижу кучу цифр и прочего. И я даже понимаю что они могут обозначать и к чему привязаны, НО я ни разу не возьму в толк как это можно соотнести к схеме работы аллокатора с векторами у меня под капотом?

Добавлено через 38 секунд
Цитата Сообщение от DrOffset Посмотреть сообщение
У jemalloc есть визуализатор. Лучше им пользоваться.
О во, спасибо)
Возможно сегодня не успею, но обязательно попробую
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.10.2023, 17:19

Освобождение памяти после динамического массива
Есть динамический массив, но почему-то на строке delete FirstPoint; студия (2010) пишет что-то про попытку записи в память после конца кучи...

Освобождение памяти после использования трёхмерного массива
Здравствуйте! Возникла трудность с удалением трехмерного массива... Моя запись: //создание float ***M = new float **; for...

Освобождение памяти после "указателя на указатель"
Подскажите пожалуйста, как корректно освободить память после вот такого выделения. int i = 0, n =0; const int size = 10; int**mass...

Резервирование памяти/освобождение памяти для трехмерного массива
Необходимо создать трехмерный массив (A), в котором элементы вдоль направления Z выли бы выровнены по 16 байт. Есть две проблемы: ...

Избавиться от статических переменных
помогите в реализации этого приложения,но так чтобы не было статических переменных static int xPos =0; static int yPos=0; #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
56
Ответ Создать тему
Новые блоги и статьи
Скрипты 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 (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru