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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
krolex
9 / 9 / 1
Регистрация: 27.01.2010
Сообщений: 63
#1

Как освободить память? - C++

25.04.2010, 15:24. Просмотров 1468. Ответов 5
Метки нет (Все метки)

подскажите как правильно освободить память,спасибо заранее)))

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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <conio.h> 
#include <stdlib.h>
 
struct zap //объявление структуры
{
    char fam[33]; 
    char nazv[30]; 
    char rez;    
    char mesto;  
    zap *ptr;
};
 
int k,n,f,ud; //k - количество,n - счетчик ,f - для rez, ud - удалене.
char udal[22]; //строка для поиска фамилии которую нужно удалить  
char sfam[33],snazv[30]; //sfam - для копирования фамилии, snazv- для копирования названия соревнований
 
zap *first,*s,*p,*q; //первый список
zap *first1,*s1,*ps1,*p1,*q1; // второй список
 
int _tmain(int argc, _TCHAR* argv[])
{
    printf("vvedite koli4estvo u4astnikov \n"); //ввод количества участников;
    scanf("%d",&k); //считывание количества участников
 
 
    s=new zap; // new(r); выделение памяти для элемента.    
    first=s; //запоминание адреса начала списка
    s->ptr=NULL; //|r^.p:=nil; указатель первого элемента на следующий нулл.
    puts("vvedite familii u4astnikov i nazvanija sorevnovanii"); //|ввод фамилий и соревнований;
    scanf("%s",s->fam); 
    scanf("%s",s->nazv); //|r^.fam:=;r^.nazv:=;
    n=1;  
    while (n<k)//счетчик
    {
        p=new zap;  // new(q); выделение памяти для элемента.    
        p->ptr=NULL;    //|q^.p:=nil; указатель первого элемента на следующий нулл.
        scanf("%s",p->fam);
        scanf("%s",p->nazv); 
 
        s=first;
        //начало сортировки по алфавиту паралелльно вводу 
        while ( s!= NULL )
        {   
            // вставка в начало
            if (strcmp(p->fam,s->fam)<=0 && s==first) //если введеный элемент меньше текущего и текущий первый то
            {
                p->ptr=s; //указатель нового на текущий
                s=p; //текущий элемент указыает тудаже куда и первый
                first=s; //в запоминающий элемент записывается P!!!!
                s=NULL; //и указание текущего элемента на P исчезает
                // вставка в конец
            } else if (strcmp(p->fam,s->fam)>=0 && s->ptr==NULL) // если новый элемент больше текущего и текущий последний то 
            {
                s->ptr=p; // текущий указывает на новый 
                s=NULL; //адрес текущей ячейки не указывает никуда
                //вставка в середину
            } else  if (strcmp(p->fam,s->fam)>=0 && strcmp(p->fam,s->ptr->fam)<=0 ) //если введеный элемент больше текущего и меньше следуйщего то
            {
                p->ptr=s->ptr; //указатель нового указывает на место куда указывал старый
                s->ptr=p; //указатель текущего указывает на новый адрес элемента
                s=NULL;  // адрес текущей ячейки нулл
 
            } else
                s=s->ptr;   //переход к следуйщему элементу
 
            n++;  //счетчик
 
        }
 
    }
    puts("----------------------------------------------------");
    //вывод участников
    s=first;
    while (s!=NULL)
    {
        printf("%s ",s->fam);
        printf("%s \n",s->nazv);
        s=s->ptr;
    }
    puts("----------------------------------------------------");
    //добавление результаты
    s=first;
    while (s!=NULL)
    {
        printf("vvedite resultat u4astnika: %s v sorevnovanii %s=",s->fam,s->nazv);
        scanf("%d",&f);
        s->rez = (char)f;
        s=s->ptr;
    }
    //печать скорректированного списка
    s=first;
    while (s!=NULL)
    {
        printf("%s ",s->fam);
        printf("%s =",s->nazv);
        printf("%d \n",s->rez);
 
        s=s->ptr;
    }
 
    //создание нового списка и сортировка по результату
    s1=new zap; // new(s1); выделение памяти для первого элемента.    
    first1=s1; //запоминание адреса начала списка
    s=first; // возврат на начало первого списка
    s1->ptr=NULL; //|s^.p:=nil; указатель первого элемента на следующий нулл.
    strcpy(sfam, s->fam); //копирование 
    strcpy(s1->fam, sfam);   //копирование фамилии
 
    strcpy(snazv,s->nazv); // копирование
    strcpy(s1->nazv,snazv); // копирование названмя соревнований
    s1->rez=s->rez; // копирование результата в новый список
 
    n=1; //счетчик
    while (n<k) 
    {
        s=s->ptr;
        p1=new zap;  // new(q); выделение памяти для элемента.    
        p1->ptr=NULL;   //|q^.p:=nil; указатель первого элемента на следующий нулл.
        strcpy(sfam, s->fam);
        strcpy(p1->fam,sfam);
 
        strcpy(snazv, s->nazv);
        strcpy(p1->nazv, snazv);
        p1->rez=s->rez;
 
        s1=first1;
        //начало сортировки по результату
        while ( s1!= NULL )
        {
            if (p1->rez<=s1->rez && s1==first1)
            {
                p1->ptr=s1;
                s1=p1;
                first1=s1;
                s1=NULL;
            } else if (p1->rez>=s1->rez && s1->ptr==NULL)
            {
                s1->ptr=p1;
                s1=NULL;
            } else  if (p1->rez>=s1->rez && p1->rez<=s1->ptr->rez)
            {
                p1->ptr=s1->ptr;
                s1->ptr=p1;
                s1=NULL;
 
            } else
 
                s1=s1->ptr;
 
            n++;
 
        }
 
    }
 
 
    //печать скорректированного нового списка
    puts("----------------------------------------------------");
    s1=first1;
    while (s1!=NULL)
    {
        printf("%s ",s1->fam);
        printf("%s =",s1->nazv);
        printf("%d \n",s1->rez);
 
        s1=s1->ptr;
    }
 
 
    //добавление места
    s1=first1;
    while (s1!=NULL)
    {
        printf("vvedite mesto u4astnika:%s v sorevnovanii %s=",s1->fam,s1->nazv);
        scanf("%d",&f);
        s1->mesto = (char)f;
        s1=s1->ptr;
    }
 
    //печать скорректированного нового списка
    puts("----------------------------------------------------");
    s1=first1;
    while (s1!=NULL)
    {
        printf("%s ",s1->fam);
        printf("%s rez=",s1->nazv);
        printf("%d mesto=",s1->rez);
        printf("%d \n",s1->mesto);
 
        s1=s1->ptr;
    }
 
    // удаление одного из участников по фамилии
    puts("udalit 1 u4astnikov vvedite - 1");
    scanf("%d",&ud);
    if (ud==1)
    {
        scanf("%s",&udal);
        puts("----------------------------------------------------");
 
        printf("vi xotite udalit u4astnika s familiej: %s",udal);
        s1=first1;
        while (s1!=NULL && strcmp(udal,s1->fam)!=0)
        {
            ps1=s1;
            s1=s1->ptr;
        }
 
        if (ps1!=NULL && s1!=NULL)
        {
            ps1->ptr=s1->ptr;
            delete s1;
        }
        else 
            puts("familii nety");
 
 
 
    }
    getch();
 
    //печать скорректированного нового списка
    puts("\n----------------------------------------------------");
    s1=first1;
    while (s1!=NULL)
    {
        printf("%s ",s1->fam);
        printf("%s rez=",s1->nazv);
        printf("%d mesto=",s1->rez);
        printf("%d \n",s1->mesto);
 
        s1=s1->ptr;
    }
 
    //освобождение памяти
    s1=first1;
    while (s1!=NULL)
    {
        delete s1;
        s1=s1->ptr;
    }
 
    s=first;
    while (s!=NULL)
    {
        delete s;
        s=s->ptr;
    }
 
    getch();
 
 
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.04.2010, 15:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как освободить память? (C++):

как освободить память? - C++
Здравствуйте!!! Почему-то никак не освобождается память, выделенная оператором new под двумерный массив типа char,- как только идет...

Как освободить память быстро? - C++
Функция malloc неправильно работает...Заполняется память быстро,а очищается долго,с чем это связано,кто знает #include&lt;iostream&gt; ...

Как правильно освободить память - C++
Написал вот такой костыль: wchar_t* getDate() { time_t seconds = time(NULL); tm timeinfo = *(localtime(&amp;seconds)); return...

Как правильно освободить память - C++
Здравствуйте все! Подскажите, как правильно освобождать память, выделенную под массив оператором new? int *Arr = new int; ... delete...

Как правильно освободить память - C++
Есть функция char* md5(const char*). Как освободить память выделенную ею? #include &lt;openssl\md5.h&gt; char* md5(const char* text) { ...

Как правильно освободить память - C++
Здрасте! (Тема: Шаблоны функций.) Не могу правильно написать метод для освобождения памяти. В мейне делаю все необходимые мне...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
delfamur
42 / 42 / 0
Регистрация: 16.03.2010
Сообщений: 199
25.04.2010, 15:33 #2
ну вообще
C++
1
delete имя_пер;
освобождает пямять, выделяемую под динамические переменные. это надо?
Vorona
Peace 2 all shining faces
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,283
25.04.2010, 15:59 #3
и не стоит освобождать ее в цикле, если выделяли вы ее просто один раз
и еще:
C++
1
2
3
4
5
6
7
8
9
10
11
zap s;//уже достаточно, что бы память была выделена статически для одного элемента типа структуры
//-----------------------------------------------------------------------------------------------
 
zap s[5];//статически выделили память для массива структур под 5 структур
//-----------------------------------------------------------------------------------------------
 
int i = 5;
zap *s;
s = new zap[i];//динамически выделили память для массива структур под 5 структур
....
delete[] s;//динамически освободили память
krolex
9 / 9 / 1
Регистрация: 27.01.2010
Сообщений: 63
25.04.2010, 16:02  [ТС] #4
пасиб,это я уже узнал,у мя в проге там список связанный и мне надо его удалить.если посмотрите прогу,там чтото написано уже в конце,но неправильно,поскольку если я затираю элемент,то уже на следующий не попадаю(((((
Vorona
Peace 2 all shining faces
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,283
25.04.2010, 16:04 #5
удалить весь список или 1 элемент?
krolex
9 / 9 / 1
Регистрация: 27.01.2010
Сообщений: 63
25.04.2010, 16:18  [ТС] #6
весь весь список
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.04.2010, 16:18
Привет! Вот еще темы с ответами:

Как правильно освободить память деструктором? - C++
Не могу понять, как освободить память деструктором... В общем, я объявляю в private динамический массив на 3 элемента, после чего память от...

Как освободить память из-под вектора объектов? - C++
vector&lt;TObj*&gt; obj; obj.push_back(new obj()); obj.erase(obj.begin()+indx);//удаляю указатель который указывал на объект &quot;Для...

Как освободить память в двумерном массиве в столбцах - C++
скажем так, чтобы освободить строку я пишу int **b; // // инициализирю массив delete b; // удаляю указатель(массив) в 3 позиции ...

Подскажите пожалуйста, как правильно освободить память - C++
Всем ку! Подскажите пожалуйста, как правильно удалить(освободить память) массива array2D. Array1D&lt;Elem&gt;* array2D = ...


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

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

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