Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
4 / 4 / 2
Регистрация: 13.11.2014
Сообщений: 108

Освобождение памяти после статических переменных

27.09.2023, 11:17. Показов 3100. Ответов 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
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 862
27.09.2023, 12:44
то что вы освободили память в программе это не значит что вектор (или malloc что у него под капотом) передал эту память системе. аллокаторы памяти немного по другому работают.
этим конечно можно управлять - но не с использованием STL.
0
4 / 4 / 2
Регистрация: 13.11.2014
Сообщений: 108
27.09.2023, 12:55  [ТС]
хмм, ok, а как ими с помощью чего-то другого управлять?
0
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 862
27.09.2023, 13:06
для начала пример: простая программа
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void PrintMemUsage( void )
{
    statm_t Statm = ReadStatm();
    LOGI("MemUsage: %d kBytes",Statm.RSS * 4);
}
 
void TestSystemInfo( void )
{
    LoggerSetShowSource(0);
    LoggerSetBreakOnError(0);
    LOGI("initial:");
    PrintMemUsage();
    size_t HugeMemBlockSize = 1024L * 1024L * 50L;
    void * HugeMemBlock = malloc(HugeMemBlockSize);
    LOGI("After malloc:");
    PrintMemUsage();
    memset(HugeMemBlock,1,HugeMemBlockSize);
    LOGI("After using memory:");
    PrintMemUsage();
    free(HugeMemBlock);
    LOGI("After free memory:");
    PrintMemUsage();
}


и её вывод :
Кликните здесь для просмотра всего текста
Code
1
2
3
4
5
6
7
8
[Info]: initial: 
[Info]: MemUsage: 536 kBytes 
[Info]: After malloc: 
[Info]: MemUsage: 536 kBytes 
[Info]: After using memory: 
[Info]: MemUsage: 53272 kBytes 
[Info]: After free memory: 
[Info]: MemUsage: 2244 kBytes


У вас используется STL - да ещё вы постоянно меняете размер - в строке 18 постоянно меняется размер - соответственно идёт реаллокация памяти, а поскольку вы этот процесс не контролируете то он может идти как угодно - этим может управлять glibc или jemalloc или ещё что у вас в системе стоит. от этого сильно разная фрагментация памяти.

что делать - заботиться о ценном ресурсе (пямяти).
https://www.softwareverify.com... nightmare/
0
4 / 4 / 2
Регистрация: 13.11.2014
Сообщений: 108
27.09.2023, 13:23  [ТС]
В системе скорее всего будет glibc.
Что и как красивого можно сделать с malloc, memset и free я в принципе понимаю, НО я сейчас просто ищу способ оптимизации небольшой проги написанной ДО меня и с многочисленными использованиями такого рода векторов в функциях. И просто хотелось бы обойтись малыми жертвами при её переписывании, чтобы не перелопачивать и переосмысливать, не только код но и подход в реализации каждой из них, по сути изобретая заново.
Хотелось бы просто найти способ сделать это как-то более лаконично. Чтобы например можно было просто проставить в конце каждой из таких функций что-то вроде free_alloc<&T_std::vector>hexCh и освободить память или как-то ещё подлезть к тому аллокатору и выцепить с него всё что нужно и закончить с этим делом.
0
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 862
27.09.2023, 13:25
кстати к своей предыдущей программе я добавил ваш код
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <vector>
 
#include <chrono>
#include <thread>
 
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <stddef.h>
#include "statistics.h"
#include "logger.h"
 
void PrintMemUsage( const char * Where )
{
    statm_t Statm = ReadStatm();
    LOGI("MemUsage: %s  =  %d kBytes",Where , Statm.RSS * 4);
}
 
 
//небольшая функция, которая должна будет у нас стартануться через секунд 25 в основном теле программы
//отработать своё и успешно свалить в закат
int test_load_OP()
{
    int ik_ = 655357; //даём размерность будущего вектора, достаточно большую,
    //чтоб мы могли точно увидеть разницу в ОП
    std::vector<std::string> hexCh; //для полного счастья у нас ещё и вектор типа string,
    //чтоб побольше неоптимальным образом занять ОП
 
    PrintMemUsage("Before push back");
    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);
    PrintMemUsage("Before clear");
    hexCh.clear();
    PrintMemUsage("Before shrink");
    hexCh.shrink_to_fit();
    //malloc_trim(0);
    return 1;
}
 
extern "C" void TestSystemInfo2( void )
{
    LoggerSetShowSource(0);
    LoggerSetBreakOnError(0);
    PrintMemUsage("test start");
    //теперь в основном теле программы имитируем некоторую жизнедеятельность
    // и по умолчанию сначала выводим Hello word!
    //чтоб хотя-бы в консоли понимать, что она запустилась
    std::cout << "Hello word!" << std::endl;
    PrintMemUsage("Before load");
    int res_run_LoadOP = test_load_OP(); //Ok теперь пускаём имитацию отработки дорогой функции
    PrintMemUsage("after load load");
}


при использовании jemalloc
Кликните здесь для просмотра всего текста
Code
1
2
3
4
5
6
7
8
[Info]: MemUsage: test start  =  3268 kBytes 
Hello word!
[Info]: MemUsage: Before load  =  3268 kBytes 
[Info]: MemUsage: Before push back  =  3268 kBytes 
[Info]: MemUsage: Before clear  =  33288 kBytes 
[Info]: MemUsage: Before shrink  =  33288 kBytes 
[Info]: MemUsage: after load load  =  12944 kBytes 
done!


при использовании glibc
Кликните здесь для просмотра всего текста
Code
1
2
3
4
5
6
7
8
[Info]: MemUsage: test start  =  2668 kBytes 
Hello word!
[Info]: MemUsage: Before load  =  2668 kBytes 
[Info]: MemUsage: Before push back  =  2668 kBytes 
[Info]: MemUsage: Before clear  =  24352 kBytes 
[Info]: MemUsage: Before shrink  =  24352 kBytes 
[Info]: MemUsage: after load load  =  4008 kBytes 
done!


попробуйте делать резерв памяти для векторов перед использованием
0
Модератор
Эксперт Java
 Аватар для alecss131
2841 / 1350 / 403
Регистрация: 11.08.2017
Сообщений: 4,307
Записей в блоге: 2
27.09.2023, 13:32
Цитата Сообщение от КиберСталкер21 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
int ik_ = 655357; //даём размерность будущего вектора, достаточно большую, 
 //чтоб мы могли точно увидеть разницу в ОП
 std::vector<std::string> hexCh; //для полного счастья у нас ещё и вектор типа string,
 //чтоб побольше неоптимальным образом занять ОП
for (int i = 0; i < ik_; i++)
 { //забиваем вектор всякой ерундой
 hexCh.push_back("sdf574 " + std::to_string(ik_));
 }
заменить на
C++
1
2
3
4
5
int ik_ = 655357;
 std::vector<std::string> hexCh(ik_); //сразу выделяем память под весь вектор
for (int i = 0; i < ik_; i++){
 hexCh[i] = "sdf574 " + std::to_string(ik_);
}
0
4 / 4 / 2
Регистрация: 13.11.2014
Сообщений: 108
27.09.2023, 13:35  [ТС]
Я так полагаю statm_t Statm = ReadStatm(); скрыт в #include "statistics.h" )
А можете хотя бы объяснить, что там скрыто?) Потому что у меня такого эффекта не наблюдается без него абсолютно)
0
Модератор
Эксперт Java
 Аватар для alecss131
2841 / 1350 / 403
Регистрация: 11.08.2017
Сообщений: 4,307
Записей в блоге: 2
27.09.2023, 13:37
Если известен размер вектора заранее то лучше не использовать push_back, либо использовать но предварительно сделав reserve.
Только вот строки могут внести свои тонкости, так как строка это по сути тот же вектор
0
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 862
27.09.2023, 13:37
C
1
2
3
4
5
6
7
8
9
10
11
12
13
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;
}
1
4 / 4 / 2
Регистрация: 13.11.2014
Сообщений: 108
27.09.2023, 13:47  [ТС]
Цитата Сообщение от alecss131 Посмотреть сообщение
заменить на
C++
1
2
3
4
5
int ik_ = 655357;
 std::vector<std::string> hexCh(ik_); //сразу выделяем память под весь вектор
for (int i = 0; i < ik_; i++){
 hexCh[i] = "sdf574 " + std::to_string(ik_);
}
Эмм не не то пальто)
Всё как было так и осталось.

Добавлено через 3 минуты
Цитата Сообщение от Aledveu Посмотреть сообщение
кстати к своей предыдущей программе я добавил ваш код
Очень интересная наверно у вас программа) Ток у меня вот вывело:
Bash
1
2
3
4
MemUsage: Before load = 1072 kBytes
MemUsage: Before clear = 37016 kBytes
MemUsage: Before shrink = 37144 kBytes
MemUsage: after load load = 32024 kBytes
Добавлено через 50 секунд
И это кстати вполне резервируя память.

Добавлено через 2 минуты
Вот кстати полностью изменённый код в итоге:
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <iostream>
#include <vector>
 
#include <chrono>
#include <thread>
 
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <stddef.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();
    //LOGI("MemUsage: %s  =  %d kBytes",Where , Statm.RSS * 4);
    std::cout << "MemUsage: " << Where << " = " << (Statm.RSS * 4) << " kBytes" << std::endl;
}
 
 
int test_load_OP()
{
    int ik_ = 655357;
    //std::vector<std::string> *hexCh = new std::vector<std::string>(0);
    std::vector<std::string> hexCh(ik_);
 
    for (int i = 0; i < ik_; i++)
    {
        //hexCh->push_back("sdf574 " + std::to_string(ik_));
        hexCh[i] = "sdf574 " + std::to_string(i);
    }
    
    //hexCh.resize(1);
    //hexCh.clear();
    //std::vector<std::string>().swap(hexCh);
    PrintMemUsage("Before clear");
    hexCh.clear();
    PrintMemUsage("Before shrink");
    hexCh.shrink_to_fit();
    //delete hexCh;
    /*
    if (hexCh != nullptr)
    {
        delete hexCh;
    }
    */
    //malloc_trim(0);
    return 1;
}
 
int main(int argc, char* argv[])
{
    std::cout << "Hello word!" << std::endl;
    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");
    int ipewq = 5;
    while (true)
    {
        ipewq++;
        ipewq--;
    }
    return 0;
}
Как видите пытался и с указателями, но delete hexCh; кстати всё равно не отработал и память также на месте, что вызывает ещё больше вопросов(
0
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 862
27.09.2023, 13:49
Цитата Сообщение от КиберСталкер21 Посмотреть сообщение
Ток у меня вот вывело:
у вас выделение памяти сразу приводит к её использованию.
операционная система когда выделяет кусок памяти - обычно выделяет только адресное пространство а помере обращения к памяти выделает страницы в физической памяти. скорее всего вектор при резервиновании не просто запрашивает у ОС память но и размещает там что-то.
0
4 / 4 / 2
Регистрация: 13.11.2014
Сообщений: 108
27.09.2023, 14:02  [ТС]
Цитата Сообщение от Aledveu Посмотреть сообщение
скорее всего вектор при резервиновании не просто запрашивает у ОС память но и размещает там что-то.
Вполне возможно, что нулями, но если попробовать сделать так:
C++
1
2
3
PrintMemUsage("After reserv vectors");
std::vector<std::string> hexCh(ik_);
PrintMemUsage("Before reserv vectors");
То покажет:
Bash
1
2
3
MemUsage: Before load = 1072 kBytes
MemUsage: After reserv vectors = 1252 kBytes
MemUsage: Before reserv vectors = 6212 kBytes
Тогда встаёт вопрос о том, куда деваются строки при clear)

Добавлено через 4 минуты
В принципе тогда можно предположить, что строки так весело разнесли там нули в ячейках, ok, попробуем их опять тогда обнулить:
C++
1
2
3
4
5
6
    PrintMemUsage("After artificial clear");
    for (int i = 0; i < ik_; i++)
    {
        hexCh[i] = "";
    }
    PrintMemUsage("Before artificial clear");
И мы получим:
Bash
1
2
MemUsage: After artificial clear = 37012 kBytes
MemUsage: Before artificial clear = 37144 kBytes
О_о увеличение памяти?) ...лол)
0
Модератор
Эксперт Java
 Аватар для alecss131
2841 / 1350 / 403
Регистрация: 11.08.2017
Сообщений: 4,307
Записей в блоге: 2
27.09.2023, 14:20
Выполните программу для размышления.
C++
1
2
3
4
5
6
7
8
9
10
11
    std::vector<std::string> vec(5);
    std::cout << "vector count: " << vec.size() << std::endl;
    std::cout << "vector size: " << sizeof(vec) << std::endl;
    std::cout << "string size: " << sizeof(vec[3]) << std::endl;
    vec[3] =  "1234567890";
    std::cout << "string size: " << sizeof(vec[3]) << std::endl;
    vec[3] = "";
    std::cout << "string size: " << sizeof(vec[3]) << std::endl;
    vec.clear();
    std::cout << "vector count: " << vec.size() << std::endl;
    std::cout << "vector size: " << sizeof(vec) << std::endl;
Размеры ни вектора ни строки не меняются при изменении их содержимого

Добавлено через 3 минуты
Я бы привел тут аналогию с динамическим двумерным массивом, только указатели заменил на объекты. Так вот первый двойной указатель (массив указателей) это вектор, а каждый элемент этого вектора, указатель, это строка.
И управление памятью что в векторе что в строке не зависит от пользователя
0
фрилансер
 Аватар для Алексей1153
6444 / 5637 / 1128
Регистрация: 11.10.2019
Сообщений: 14,994
27.09.2023, 14:29
Цитата Сообщение от КиберСталкер21 Посмотреть сообщение
PrintMemUsage
распечатывать нужно тогда уж capacity вектора

Добавлено через 1 минуту
и вообще, нужно сделать минимальный синтетический пример, где аллокация будет только у этого вектора. На этом примере и тестить пожирание озу
1
4 / 4 / 2
Регистрация: 13.11.2014
Сообщений: 108
27.09.2023, 16:37  [ТС]
Цитата Сообщение от alecss131 Посмотреть сообщение
Размеры ни вектора ни строки не меняются при изменении их содержимого
Ok, в это мы верим)
А как изменить то их размеры и высвободить из памяти?
0
4 / 4 / 2
Регистрация: 13.11.2014
Сообщений: 108
28.09.2023, 10:56  [ТС]
Короче загадка "дыры в заборе" разгадана)
Вектор как таковой правильно работал и вполне себе освобождался при выходе из функции и обычный .clear() более чем отрабатывал. Весь фокус мы потом имели именно в std::string в векторе)
По сути именно там и происходит утечка в ОП, когда получаем, что вектор вроде как и "освободился от своих элементов", а в тоже время теперь эти элементы привязались к тому, что скрывается под капотом у строк и никак не желают с этим расстаться)
Проверить это достаточно просто прописав в вектор int.
Нуу а теперь поправить код можно будет парочкой грамотных автозамен и немного ручного труда)
Всем спасибо за советы и подсказки, а также ChatGPT за то, что показала ещё приколдесину с использованием std::shared_ptr и std::unique_ptr, кстати потом получше очищает память) ...а я её знатно помучал

Добавлено через 2 минуты
//P.S. модератор пометьте тогда моё предыдущее сообщение как ответ)
0
фрилансер
 Аватар для Алексей1153
6444 / 5637 / 1128
Регистрация: 11.10.2019
Сообщений: 14,994
28.09.2023, 10:58
Цитата Сообщение от КиберСталкер21 Посмотреть сообщение
а в тоже время теперь эти элементы привязались к тому, что скрывается под капотом у строк и никак не желают с этим расстаться)
непонятно. У всех элементов вектора должен был вызваться деструктор
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
28.09.2023, 11:06
КиберСталкер21, честно говоря вы занимаетесь ерундой. Показания "системного монитора" еще нужно правильно трактовать.
Никакого перерасхода памяти у вас не происходит, просто если система будет постоянно гонять страницы (занятые аллокатором вашей программы) туда сюда, то будет только хуже. Поэтому аллокаторы не спешат сразу отдавать их системе, потому что есть немаленькая вероятность, что они понадобятся снова. А запрос новой страницы - это существенное время (по сравнению с использованием уже предоставленной ранее).
К тому же в системе с виртуальной памятью в принципе нельзя точно сказать сколько действительно физической памяти сейчас занято. Те цифры, которые вы видите, - это виртуальные цифры. Они обозначит лишь то, что ваша программа технически сейчас может использовать столько-то байт памяти, а действительно ли она их использует эта информация не отражает.
Почитайте для общего понимания: https://ru.wikipedia.org/wiki/Страничная_память
0
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 862
28.09.2023, 11:15
DrOffset, Современным программистам на с++ не надо лезть в тонкости работы системы, их освободили от ручного управления ресурсами. Поэтому ничего удивительного в том, что сейчас эти тонкости по управлению ресурсами мало кто понимает. Да и не требуется это уже в большинстве случаев.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.09.2023, 11:15
Помогаю со студенческими работами здесь

Освобождение памяти после динамического массива
Есть динамический массив, но почему-то на строке 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...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru