Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
nill
10 / 10 / 0
Регистрация: 16.08.2009
Сообщений: 417
#1

Как определить какой массив ест память - C++

02.08.2011, 01:03. Просмотров 1328. Ответов 11
Метки нет (Все метки)

В проге куча всяких массивов в том числе глобальных

Со временем объем занимаемой оперативной памяти начинает расти, прога пишет всякие данные в массивы в бесконечном цикле

в коде не использую ни malloc/free ни new/delete

1) правильно понимаю что есть память увеличиваясь со временем может только глобальный массив ?
или массив внутри функции тоже может после инициализации увеличить объем занимаемой памяти ?

2) Можно как то посмотреть какой массив сколько ест памяти в процессе выполнения проги ?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.08.2011, 01:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как определить какой массив ест память (C++):

Массив и память. Как создать динамический массив? - C++
не могу исправить ошибки. И нужен динамический массив я что-то попробовала для его создания но ничего не вышло #include "stdafx.h" ...

Как выделяется память под массив string? - C++
В общем читаю книжку, там объявлены два массива int* p = new int, int* v = new string... бла бла бла ....а потом -> ...После резервирования...

Как выделить память под массив в структуре? - C++
Здравствуйте , воnрос конечно глуnый , но голову я сижу ломаю долго , есть Структура , в ней есть массив , как nод этот массив выделить...

Как выделить память под динамический двумерный массив - C++
Добрый день, достаточно простой вопрос, но почему-то он возник, и нагуглить ответ я не смог. Обычно выделял память под двумерный массив...

Как правильно выделить память под двумерный массив в шаблоне? - C++
template <class T> T* array <T>::f (unsigned size) { //...... T* templateBuf = new T ; for (unsigned index = 0;...

Как определить, какой символ был введен? - C++
# include <iostream> # include <iomanip> using namespace std; # include <conio.h> void main() { char symbol; cout <<...

11
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,008
02.08.2011, 01:11 #2
Массивы не могут изменять свой размер, если не используется динамическое выделение. А вот вектора, списки и другие контейнеры могут. Правда утечки памяти в этом случае нет. Неправильное использование ресурсов системы тоже может вести к утечкам памяти.

Цитата Сообщение от nill Посмотреть сообщение
2) Можно как то посмотреть какой массив сколько ест памяти в процессе выполнения проги ?
Ну раз уж массив статический или автоматический, то какой у массива размер, столько памяти он и ест.
И вопрос ещё, какая память растет? Физическая или виртуальная?
0
nill
10 / 10 / 0
Регистрация: 16.08.2009
Сообщений: 417
02.08.2011, 01:20  [ТС] #3
grizlik78
то есть получаеться если использую в проге массивы внутри функции или глобальные без всяких new/delete то проблема не в них и они не могут увеличиться в размерах ?

И вопрос ещё, какая память растет? Физическая или виртуальная?
оперативная память
смотрю в диспечере задач windows, количество занимаемой памяти постоянно растет

Прога кстати все время запрашивает и записыват данные в БД может тут может быть проблема но только где ?
0
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,008
02.08.2011, 01:37 #4
Цитата Сообщение от nill Посмотреть сообщение
Прога кстати все время запрашивает и записыват данные в БД может тут может быть проблема но только где ?
Да везде она может быть. Если сторонняя библиотека используется, то в ней может быть проблема. В общем, гадать можно бесконечно
Насчёт инструментов для анализа, то если под Windows, то я вряд ли посоветую что-либо.
0
nill
10 / 10 / 0
Регистрация: 16.08.2009
Сообщений: 417
02.08.2011, 09:42  [ТС] #5
Насчёт инструментов для анализа, то если под Windows, то я вряд ли посоветую что-либо.
да нужно под windows
проблема оказалась даже больше чем я думал и очень сложно найти причину что там ест память

никогда небыло проблем с глобальными массивами
единственное большое отличие которое есть сейчас и не было раньше я использую сразу два подключения к двум базам Postgres у каждого подключения свои глобальые переменные тут может быть проблема ?
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
02.08.2011, 16:08 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Сорок два!
Посмотри код в строке 42.
3
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2011, 16:26 #7
Цитата Сообщение от nill Посмотреть сообщение
Прога кстати все время запрашивает и записыват данные в БД может тут может быть проблема но то
Как реализован доступ к БД???Множество незавершённых потоков доступа к файлу могут также вызывать увеличение объёма памяти использованного программой.Код нужен для анализа, говорить вокруг да около можно много но безрезультатно...

Добавлено через 1 минуту
Цитата Сообщение от Deviaphan Посмотреть сообщение
Сорок два!
Посмотри код в строке 42.
К чему???
1
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
02.08.2011, 16:28 #8
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
К чему???
Ошибка там. В коде. У ТС.
0
nill
10 / 10 / 0
Регистрация: 16.08.2009
Сообщений: 417
02.08.2011, 18:07  [ТС] #9
-=ЮрА=-
Доступ к БД организован очень просто в начале каждой функции
1)идет подключение к БД
2)выполняються запросы
3)запись результатов в массив
4)отключение от БД

и так много много раз

ниже код функции, цикл которой постоянно ест память
можешь посоветовать что тут может быть не так ?

Deviaphan
будет неплохо если скажешь что нить умное, шутить я вижу ты умеешь как насчет знаний в с++ ?

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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
void connect_to_DB(){
 
    string lll="host=192.168.0.119 port=5432 user='postgres' password='qwerty' dbname='DB'";
    p_pgconn1=PQconnectdb(lll.c_str());
 
}
 
 
void PREFLOP_vesa(){
    connect_to_DB();
 
    int tip_position[25]={0};//[25]-id stati
    string cnt_dla_stati[25];
    string cnt_ryk_dla_stati[25];
 
 
    int i=0; int j=0; int k=0; int id_s=0; int d=0; int p=0;
    string obsee1_srednia_stata_1[5];
    string obsee1_srednia_stata_2[5];
 
    string main_zapros_ALL;
 
 
    string hands[170]; char szbuff[255];
 
 
    /////////////////////////////////nacalo_zaprosa
    string nacalo_zaprosa1="select avg((cnt_dla_stati::int)::real/(cnt_ryk_dla_stati::int)::real), sum(cnt_ryk_dla_stati), sum(cnt_dla_stati)  from (select (sum((case when ";
    string nacalo_zaprosa2=" then  1 else  0 end))) as cnt_dla_stati, ";
    string nacalo_zaprosa3=" as cnt_ryk_dla_stati";
 
    ////////////////////////////////////////////////////////////obsee1
    string obsee1_1[5]; string obsee1_2[5];
 
 
    /////////////////////////////////ne_delit_na_nol 
    string ne_delit_na_nol1=" GROUP BY player_name HAVING ";
    string ne_delit_na_nol2=" >0 ";
    ///////////////////////////////////////////
 
 
    string meloch2=" ) as overall";
 
 
 
 
    string position[11][2];
 
 
    int pos=0;
 
    for(p=0; p<10; p++){
        for(i=Nach_preflop_stats; i<End_preflop_stats; i++){
            if(preflop_zavisimiy_stat_ili_net[i]==0){
                if(players_name[p]!=""){
                    for(pos=0; pos<position_end[i]; pos++){
 
                        main_zapros_ALL=nacalo_zaprosa_srednia_stata1+cnt_dla_stati[i]+nacalo_zaprosa_srednia_stata2+cnt_ryk_dla_stati[i]+nacalo_zaprosa_srednia_stata3;
                        main_zapros_ALL=main_zapros_ALL+obsee1_srednia_stata_1[tip_zaprosa[1][i]]+players_name[p]+obsee1_srednia_stata_2[tip_zaprosa[1][i]]+position[pos][tip_position[i]];
                        main_zapros_ALL=main_zapros_ALL+ne_delit_na_nol1+cnt_ryk_dla_stati[i]+ne_delit_na_nol2+meloch2;
 
                        p_pgresult1 =PQexec(p_pgconn1, main_zapros_ALL.c_str());
                        if (p_pgresult1 != NULL&&PQntuples(p_pgresult1)>0)
                        {
 
                            prosent_glavnoi_stati_preflop[p][i][pos] = atof(PQgetvalue(p_pgresult1, 0, 0));//prosent glavnoi stati, vozmoznost dla stati razdelit na cnt_ryk_dla_stati
                            vse_vozmoznosti_dla_stati_preflop[p][i][pos] = atof(PQgetvalue(p_pgresult1, 0, 1));//sum(cnt_ryk_dla_stati) vse vozmoznosti dla stati
 
                            ryk_v_spektre_po_state_preflop[p][i][pos] =prosent_glavnoi_stati_preflop[p][i][pos] *13.26*100;
 
                            for(k=1; k<170; k++){
 
                                main_zapros_ALL=nacalo_zaprosa1+cnt_dla_stati[i]+nacalo_zaprosa2+cnt_ryk_dla_stati[i]+nacalo_zaprosa3;
                                main_zapros_ALL=main_zapros_ALL+obsee1_1[tip_zaprosa[1][i]]+players_name[p]+obsee1_2[tip_zaprosa[1][i]];
                                main_zapros_ALL=main_zapros_ALL+hands[k]+position[pos][tip_position[i]]+ne_delit_na_nol1+cnt_ryk_dla_stati[i]+ne_delit_na_nol2+meloch2;
 
 
 
                                p_pgresult1 =PQexec(p_pgconn1, main_zapros_ALL.c_str());
 
                                if (PQntuples(p_pgresult1)>0)
                                {
 
                                    if(i!=0){
                                        massiv_resultatov[p][i][pos][k][0] = atof(PQgetvalue(p_pgresult1, 0, 0));//ves konkretnoi ryki vozmoznost dla stati razdelit na cnt_ryk_dla_stati
                                        massiv_resultatov[p][i][pos][k][1] = atof(PQgetvalue(p_pgresult1, 0, 1));//sum(cnt_ryk_dla_stati) vse vozmoznosti dla stati
 
                                        if(atoi(PQgetvalue(p_pgresult1, 0, 2))==0||atoi(PQgetvalue(p_pgresult1, 0, 1))==0){massiv_resultatov[p][i][pos][k][0]=0;}
 
                                        if(PQgetvalue(p_pgresult1, 0, 0)=="0"){massiv_resultatov[p][i][pos][k][0]=0;}
 
 
                                        if(vse_vozmoznosti_dla_stati_preflop[p][i][pos]!=0){
                                            massiv_resultatov[p][i][pos][k][2] =(double)massiv_resultatov[p][i][pos][k][1]/vse_vozmoznosti_dla_stati_preflop[p][i][pos]/**kolich_ryk[k]*/;// obsiy ves
                                        }else{
                                            massiv_resultatov[p][i][pos][k][2]=0;}
 
                                    }
                                    if(i==0){
                                        massiv_resultatov[p][i][pos][k][1] = atof(PQgetvalue(p_pgresult1, 0, 1));//sum(cnt_ryk_dla_stati) vse vozmoznosti dla stati
                                        //  massiv_resultatov[p][i][k][0] = atof(PQgetvalue(p_pgresult1, 0, 0));//ves konkretnoi ryki vozmoznost dla stati razdelit na cnt_ryk_dla_stati
                                        if(vse_vozmoznosti_dla_stati_preflop[p][i][pos]!=0){
                                            massiv_resultatov[p][i][pos][k][0] =(double)massiv_resultatov[p][i][pos][k][1]/vse_vozmoznosti_dla_stati_preflop[p][i][pos]*kolich_ryk[k];// obsiy ves
                                            massiv_resultatov[p][i][pos][k][2] =(double)massiv_resultatov[p][i][pos][k][1]/vse_vozmoznosti_dla_stati_preflop[p][i][pos]*kolich_ryk[k];// obsiy ves
                                        }
                                        else{
                                            massiv_resultatov[p][i][pos][k][0] =0;
                                            massiv_resultatov[p][i][pos][k][2] =0;
                                        }}
                                }
                                else{
 
                                    massiv_resultatov[p][i][pos][k][0] =0;
                                    massiv_resultatov[p][i][pos][k][1] =0;
                                    massiv_resultatov[p][i][pos][k][2] =0;
                                }
 
 
 
                                obsee_kolvo_ryk_v_spektre[p][i][pos]+=massiv_resultatov[p][i][pos][k][0]*kolich_ryk[k];             }
 
 
 
 
 
                            cout <<players_name[p]<<" "<<symbol_for_Preflop_komb(i)<<" end"<< endl;
 
                        }
 
                    }}}}}
 
 
 
 
    PQfinish(p_pgconn1);
}
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
02.08.2011, 18:48 #10
Комментируешь тело цикла и построчно раскомментируешь и смотришь, когда появятся утечки.
А вообще посмотри про использование PQ* функций. Возможно после них нужно явно выполнять очистку.

Добавлено через 1 минуту
Цитата Сообщение от nill Посмотреть сообщение
как насчет знаний в с++
А что ещё можно ответить на вопрос "У меня утечки памяти в программе, что делать?". Задавай вопрос нормально, тебе и ответят.
1
nill
10 / 10 / 0
Регистрация: 16.08.2009
Сообщений: 417
02.08.2011, 20:16  [ТС] #11
Цитата Сообщение от Deviaphan Посмотреть сообщение
Комментируешь тело цикла и построчно раскомментируешь и смотришь, когда появятся утечки.
А вообще посмотри про использование PQ* функций. Возможно после них нужно явно выполнять очистку.
спасибо за совет насчет комментариев!
нашел строку из за которой идет постоянное увеличение занимаемого объема проги в оперативной памяти

C++
1
p_pgresult1 =PQexec(p_pgconn1, main_zapros_ALL.c_str());
что с ней сделать как очистить ?
не смог найти примеров как чистить память после PQ функций
0
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,008
02.08.2011, 20:40 #12
Цитата Сообщение от nill Посмотреть сообщение
что с ней сделать как очистить ?
C
1
PQclear(p_pgresult1);
Цитата Сообщение от nill Посмотреть сообщение
не смог найти примеров как чистить память после PQ функций
Удивительно.
http://www.postgresql.org/docs/8.0/s...q-example.html
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2011, 20:40
Привет! Вот еще темы с ответами:

Как определить - в какой системе счисления введены данные - C++
Привет народ, такой вопрос: С++ как вы знаете понимает числа в восьмеричной (нужно поставить перед числом 0) и в шестнадцатеричной системах...

Есть исходники браузера, на С++, где найти информацию или как определить какой файл, за что отвечает? - C++
доброго времени, форумчане. Есть исходники браузера, на С+. Файлов немерено. Где найти информацию или как определить какой файл, за что...

Как передвигать указатель чтобы выделить память под новый элемент и добавить новый элемент в массив? - C++
Допустим есть некое условие,нам нужно при каждом его выполнении выделить память под новый элемент и добавить его в массив. Вопрос:Как...

Как в выделенную память записать поочередно число int, массив char[n], и еще число int - C++
Выделяю память void* Start=malloc(Size); Как туда записать поочередно число int, массив char, и еще число int?


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

Или воспользуйтесь поиском по форуму:
12
Yandex
Объявления
02.08.2011, 20:40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru