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

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

Восстановить пароль Регистрация
 
nikitaevg
0 / 0 / 0
Регистрация: 23.07.2011
Сообщений: 57
06.01.2013, 16:55     Засорение памяти #1
Добрый день, так как я еще школьник и знаю очень мало, прошу не ругать. Написанная мной программа если запускать ее снова и снова(поставить 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 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
Ушёл с форума.
 Аватар для 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 , на эту метку.
taras atavin
Ушёл с форума.
 Аватар для 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     Засорение памяти
Ответ Создать тему
Опции темы

Текущее время: 13:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru