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

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

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

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

06.01.2013, 16:55. Просмотров 319. Ответов 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.01.2013, 16:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Засорение памяти (C++):

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

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

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

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

Распределение памяти. Динамическое выделение памяти - C++
an-1 an-2 ... a2

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

5
DU
1483 / 1129 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
06.01.2013, 17:23 #2
куча операторов new [] и ни одного оператора delete [], т.е. память только выделяется, нигде не освобождается.
при наличии меток и операторов goto разбираться в этом сложно и исправлять, соответственно, тоже.
перепешите без goto, вместо явного выделения памяти используйте std::vector
1
nikitaevg
0 / 0 / 0
Регистрация: 23.07.2011
Сообщений: 57
06.01.2013, 17:32  [ТС] #3
Т.е. надо просто добавить delete и избавиться от goto?
0
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;
1
nikitaevg
0 / 0 / 0
Регистрация: 23.07.2011
Сообщений: 57
06.01.2013, 17:39  [ТС] #5
В конце есть goto , на эту метку.
0
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 уместен, но лучше пересмотреть порядок, в котором операции записаны.
1
06.01.2013, 17:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.01.2013, 17:46
Привет! Вот еще темы с ответами:

Засорение свободной памяти - Windows 7
Здравствуйте. Не так давно обнаружилась проблема: Вся свободная память забивается неизвестно чем. Антивирусы не находят ничего. ...

Засорение в гнезде шлейфа - Электроника
Гнездо шлейфа засорилось ватой, внутри крючки, которые цепляют волокна. Как её оттуда вытащить? - Иголкой не получается.

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

Выбор памяти для материнской памяти Gigabyte GA-F2A88XN-WIFI - Оперативная память
Всем доброго дня! Есть материнская плата Gigabyte GA-F2A88XN-WIFI в ее спецификациях на официальном сайте в разделе Memory есть...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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