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

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

Войти
Регистрация
Восстановить пароль
 
nikitaevg
0 / 0 / 0
Регистрация: 23.07.2011
Сообщений: 57
#1

Засорение памяти - C++

06.01.2013, 16:55. Просмотров 302. Ответов 5
Метки нет (Все метки)

Добрый день, так как я еще школьник и знаю очень мало, прошу не ругать. Написанная мной программа если запускать ее снова и снова(поставить goto в конце) начинает жрать все больше и больше оперативной памяти. Как это исправить? Это началось после добавления ф-ии put. Вот код:
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
// Otd.cpp: пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ
// пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ.
// 
 
#include "stdafx.h"
#include<iostream>
#include<ctime>
using namespace std;
/*int sea(int x,long int *mas,int kol)
{
    int t=1;
    for(int i=0;i<kol;i++)
        if(x==mas[i])
        {t=2;goto r;}
        r:;
 
    return t;
}*/
long int put(long int **matr,long int xn,long int yk,long dln)
{
    long int *si=new long int[dln*dln];
    long int x1,y1;
    x1=xn;
    long int s=0;
    long int dt=0;
    long int *dt1=new long int[dln*dln];
    long int dl=matr[xn][yk];
    if(dl==1&&dl==0)
        goto f;
    for(int i=1;i<=dln+1;i++)
    {
     while(i>=dln+1)
        {
            if(s==0)
                goto f;
            s--;
            
            i=si[s]+1;
            if(s==0)
            {x1=xn;dt=0;}
            else
            {x1=si[s-1];dt=dt1[s-1];}
 
        }
        if(matr[x1][i]+dt<dl&&i!=x1)
        {
            for(int j=0;j<s;j++)
                if(si[j]==i)
                    goto s;
            si[s]=i;
            dt+=matr[x1][i];
            dt1[s]=dt;
            x1=i;
            s++;
            i=0;
            if(matr[x1][yk]+dt<dl)
                dl=matr[x1][yk]+dt;
        }
        s:;
        
    }
    f:;
    return dl;
}
 
int main(void)
{
s2:;
    
    long int dn = 0;
    long int kgor = 0;
    long int kmer = 0;
    //cin >> dn >> kgor >> kmer;
    dn=rand()%20000+3;
    kgor=rand()%249+1;
    kmer=rand()%17+1;
    long int **p = new long int *[kgor+1];
    for (long int i = 0; i <= kgor; i++)
        p[i] = new long int[kgor+1];
    long int *dm=new long int[kmer];
    long int *nm=new long int[kmer];
    long int *km=new long  int[kmer];
    for (long int i = 1; i <= kgor; i++)
        for (long int j = 1; j <= kgor; j++)
            {//cin >> p[i][j];
                if(i==j)
                    p[i][j]=0;
                else
                    p[i][j]=rand()%(dn-1)+1;
        }
    for (long int i = 0; i < kmer; i++)
        {//cin >> dm[i] >> nm[i] >> km[i];
            dm[i]=rand()%(kgor-1)+1;
            nm[i]=rand()%(dn-2)+1;
            km[i]=rand()%(dn-nm[i])+nm[i];
    }
 
    long int tmp1 = 0;
    long int tmp2 = 0;
    long int tmp3 = 0;
    for (long int i = kmer - 1; i > 0; i--)
    {
        for (long int j = 0; j < i; j++)
        {
            if (nm[j] > nm[j + 1])
            {
                tmp2 = nm[j];
                nm[j]= nm[j + 1];
                nm[j + 1]= tmp2;
                tmp1 = dm[j];
                dm[j]= dm[j + 1];
                dm[j + 1]= tmp1;
                tmp3 = km[j];
                km[j] = km[j + 1];
                km[j + 1]= tmp3;
            }
        }
    }
 
    long int ds = 1;
    long int gor = 1;
    long int s = 0;
    long int *si = new long int[kmer];
    long int sf = 0;
    for (long int i = 0; i <= kmer; i++)
    {
        //cout<<i<<' '<<s<<endl;
        if (s > sf)
                sf = s;
        if (i >= kmer)
        {
        
             do
            {
                if (s == 0)
                    goto f;
                si[s] = 0;
                s--;
                if (s == 0)
                {
                    gor = 1;
                    ds = 1;
                    i = si[s];
                }
                else
                {
                    ds = km[si[s - 1]];
                    gor = dm[si[s - 1]];
                    i = si[s];
                }
            }
            while(i>=kmer);
        }
        else if (ds + put(p,gor,dm[i],kgor) <= nm[i])
            {
                if (km[i] + put(p,dm[i],1,kgor) <= dn)
                {
                    si[s] = i;
                    s++;
                    ds = km[i];
                    gor = dm[i];
                    
                }
            }
    }
  f:;
    cout << "ok";
    goto s2;
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.01.2013, 16:55     Засорение памяти
Посмотрите здесь:

Строки - засорение памяти - C++
1) Допустим у меня встречается текст void Function() { char* str1=&quot;abcd&quot;; // или const char*, как все советуют // тело...

Выделить в памяти 1024 ячейки по 8 байт и вывести их адреса(МИНИ менеджер памяти)) - C++
Вот тут появилась такая интересная задача: требуется сделать программу которая управляет 1024 ячейками памяти по 8 байт каждая. т.е. за...

Можно ли разместить переменную в нужную ячейку памяти и реально ли хранить данные, разбросанными по памяти? - C++
Добрый день. Не могу найти информацию по двум вопросам : 1) могу ли я разместить переменную в нужную ячейку памяти. Например: int a...

1 Гб не буферизованной памяти или 2 Гб памяти с буферизацией. Как это понимать ? - Компьютерное железо
1 Гб не буферизованной памяти или 2 Гб памяти с буферизацией Как это понимать ? И что будет если я установлю 2 Гб не буферизованной...

Распределение памяти для выделения и освобождения блоков памяти внутри запрошенного пула - C (СИ)
В программе малые&quot;дыры&quot; избегают,что нужно сделать что бы малые &quot;дыры&quot; не избегались.... # include &lt;stdio.h&gt; # include &lt;stdlib.h&gt; ...

На GeFoce GT 230 с 1,5 гига памяти доступно только 255 мегабайт графической памяти. - Видеокарты
У меня GeForce GT230 1,5 гига памяти. Но под виндой доступно только 255 мегабайт графической памяти. С чем это связано?

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1482 / 1058 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
06.01.2013, 17:23     Засорение памяти #2
куча операторов new [] и ни одного оператора delete [], т.е. память только выделяется, нигде не освобождается.
при наличии меток и операторов goto разбираться в этом сложно и исправлять, соответственно, тоже.
перепешите без goto, вместо явного выделения памяти используйте std::vector
nikitaevg
0 / 0 / 0
Регистрация: 23.07.2011
Сообщений: 57
06.01.2013, 17:32  [ТС]     Засорение памяти #3
Т.е. надо просто добавить delete и избавиться от goto?
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.01.2013, 17:38     Засорение памяти #4
Цитата Сообщение от nikitaevg Посмотреть сообщение
s2:;
Что это?

Добавлено через 1 минуту
Цитата Сообщение от nikitaevg Посмотреть сообщение
long int **p = new long int *[kgor+1];
Здесь память и выделяется, но ни где не освобождается. Для освобождения пиши
C++
1
delete [] p;
nikitaevg
0 / 0 / 0
Регистрация: 23.07.2011
Сообщений: 57
06.01.2013, 17:39  [ТС]     Засорение памяти #5
В конце есть goto , на эту метку.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.01.2013, 17:46     Засорение памяти
Еще ссылки по теме:

Какую лучше выбрать видеокарту - с большим объёмом памяти или большими частотами памяти? - Видеокарты
Какую лучше выбрать видеокарту - с большим объёмом памяти или большими частотами памяти?! Всё вместе не получается(

1 Гб не буферизованной памяти или 2 Гб памяти с буферизацией - Оперативная память
1 Гб не буферизованной памяти или 2 Гб памяти с буферизацией Как это понимать ? И что будет если я установлю 2 Гб не буферизованной...

Выделение памяти (CodeGear RAD Studio 2009 - C++ builder). Выделение памяти - консоль vs SDIApp - C++ Builder
Есть определенный класс - длинная арифметика. Не идеальный - хранение данных исполнено в виде динамического массива типа short int, каждая...

Перезагружается компьютер после установки памяти + нет настройки памяти в BIOS - Оперативная память
Добрый день! Помогите пожалуйста разобраться в следующей ситуации, после установки оперативной памяти Kingston DDR3-1600 8192MB...


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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.01.2013, 17:46     Засорение памяти #6
Цитата Сообщение от nikitaevg Посмотреть сообщение
p[i] = new long int[kgor+1];
Это тоже выделяет, а освобождения нет. Освобождать так:
C++
1
delete [] p[i];
, причём, перед
C++
1
delete []p;
.

Добавлено через 1 минуту
Цитата Сообщение от nikitaevg Посмотреть сообщение
(поставить goto в конце)
Этот оператор для циклов не предназначен.

Добавлено через 5 минут
Цитата Сообщение от nikitaevg Посмотреть сообщение
В конце есть goto , на эту метку.
Так это метка? Тогда почему на пустом операторе? Ставил бы уж на следующий, раз охота испортить софтину. goto надо использовать только тогда, когда именно переход и имеется ввиду, а не цикл, или условие.
C++
1
2
3
4
5
6
7
8
9
10
int a;
int b;
int c;
goto f;
s:b=a*2;
  goto t;
f:std::cin>>a;
  goto s;
t:c=b+23;
std::cout<<c;
. Вот здесь goto уместен, но лучше пересмотреть порядок, в котором операции записаны.
Yandex
Объявления
06.01.2013, 17:46     Засорение памяти
Ответ Создать тему
Опции темы

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