Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
3 / 3 / 4
Регистрация: 18.11.2013
Сообщений: 172
1

Правильно выделить и освободить память

18.11.2013, 15:46. Показов 788. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите,пожалуйста, правильно выделить и освободить память.
Чтобы не было утечек памяти.

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
#include <stdio.h>
#include <Windows.h>
#include <locale.h>
#include <time.h>
 
#define CRTDBG_MAP_ALLOC
#include <crtdbg.h>
 
int main()
{
    setlocale(0, "");
 
    srand(time(NULL));
 
    int **a = NULL;
    int height = 0;
    int width = 0;
    int sort;
    int numb = 0;
    int numb2 = 0;
    int t = 0;
 
    printf("Программа сортировки строк двухмерного динамического массива по возрастанию\n\n");
 
    do
    {
        fflush(stdin);
        printf("1. Задать размерность двухмерного массива\n");
        printf("2. Выбор заполнения массива\n");
        printf("3. Обработка массива\n");
        printf("4. Вывод обработанного массива на экран\n");
        printf("0. Выход и программы\n");
        scanf_s("%d", &numb);
        system("cls");
 
        switch(numb)
        {
        case 1:
            {               
                for ( int i = 0; i < height; i ++ )
                {
                    delete [] a[i];
                }
                delete [] a;
 
                do
                {       
                    fflush(stdin);
                    printf("Введите размерность массива: ");
                    printf("\nШирина:> ");
                    scanf_s("%d", &width);
                    printf("Высота:> ");
                    scanf_s("%d", &height);
                    system("cls");
                }
                while ( height <= 0 || width <= 0);
                
                a = new int * [height];
                
                for ( int i = 0; i < height; i ++ )
                {
                    a[i] = new int [width];
                }
 
                t = 1;
                break;
            }
        case 2:
            {
                if ( t > 0 )
                {
                    for ( int i = 0; i < height; i ++ )
                    {
                        delete [] a[i];
                    }
                    delete [] a;
                    
                    do
                    {
                        fflush(stdin);
                        printf("Выберите:\n 1. С клавиатуры\n 2. Рандомно\n");
                        scanf_s("%d", &numb2);
                        system("cls");
                    }
                    while ( numb2 != 1 && numb2 != 2 );
                    
                    a = new int * [height];
                
                    for ( int i = 0; i < height; i ++ )
                    {
                        a[i] = new int [width];
                    }
 
                    switch (numb2)
                    {
                    case 1:
                        {
                            printf("Заполните массив:\n");
 
                            for ( int i = 0; i < height; i ++ )
                            {
                                for( int j = 0; j < width; j ++ )
                                {
                                    printf("Введите элемент %d-ой строчки %d-ого столбца: ", i + 1, j + 1);
                                    scanf_s("%d", &a[i][j]);
                                }
                                system("cls");
                            }
                            break;
                        }
                    case 2:
                        {
                            printf("Массив заполнен рандомно");
                            getchar();
                            getchar();
                            system("cls");
 
                            for ( int i = 0; i < height; i ++ )
                            {
                                for( int j = 0; j < width; j ++ )
                                {
                                    a[i][j] = rand() % 50 - 25;
                                }
                            }
                            break;
                        }
                    }
                    t = 2;
                }
                else
                {
                    printf("Задайте размерность массива\n");
                    getchar();
                    getchar();
                    system("cls");
                }
                break;
            }
        case 3:
            {
                if ( t == 2 )
                {
                    printf("Вот сам массив:\n");
 
                    for ( int i = 0; i < height; i ++ )
                    {
                        for( int j = 0; j < width; j ++ )
                        {
                            printf("%4d", a[i][j]);
                        }
                        printf("\n");
                    }
                    getchar();
                    getchar();
                    system("cls");
 
                    for ( int j = 0; j < width; j ++ )
                    {
                        for ( int i = 1; i < height; i ++ )
                        {
                            for ( int k = 1; k < height; k ++ )
                            {
                                if ( a[k - 1][j] > a[k][j] )
                                {
                                    sort = a[k - 1][j];
                                    a[k - 1][j] = a[k][j];
                                    a[k][j] = sort;
                                }
                            }
                        }
                    }
                    printf("Массив обработан\n");
                    getchar();
                    system("cls");
                    t = 2;
                }
                else
                {
                    printf("Сделайте предыдущий шаг");
                    getchar();
                    getchar();
                    system("cls");
                }
                break;
            }
        case 4:
            {
                if ( t == 2 )
                {
                    printf("Вот обработанный массив\n");
 
                    for ( int i = 0; i < height; i ++ )
                    {
                        for( int j = 0; j < width; j ++ )
                        {
                            printf("%4d", a[i][j]);
                        }
                        printf("\n");
                    }
                    getchar();
                    getchar();
                    system("cls");
                }
                else
                {
                    printf("Сделаете предыдущий шаг");
                    getchar();
                    getchar();
                    system("cls");
                }
                break;
            }
        }
 
    }
    while ( numb != 0 );
    
    _CrtDumpMemoryLeaks();
    
    for ( int i = 0; i < height; i ++ )
    {
        delete [] a[i];
    }
    
    delete [] a;
    
    return 0;
}
Народ,подскажите,пожалуйста.К этой программе мне нужно сделать промежуточное хранение данных.Что это вообще такое?

 Комментарий модератора 
Не нужно плодить одинаковые темы!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.11.2013, 15:46
Ответы с готовыми решениями:

Как правильно освободить память двумерного массива
Память для test выделена так: char **test; test = (char **)calloc(n, sizeof(char *)); Чтобы...

Правильно выделить память под односвязный список
Не могу правильно выделить память под односвязный список. Укажите, пожалуйста, мою ошибку:...

Как правильно выделить память под двумерный динамический массив
подскажите как правильно выделить память под двумерный динамический массив?

Освободить незадействованную память
у меня создается список под каждый элемент выделяю память,потом с этим списком происходят операции...

5
419 / 418 / 167
Регистрация: 28.11.2010
Сообщений: 1,183
19.11.2013, 02:42 2
У препода спросите, что он имеет в виду.
По коду, у вас логика работы программы страдает,
строки 24-29 просто бессмысленны
+ пишите вроде на Си, а выделение.освобождение памяти из С++
А вы функции уже учили? Почему бы часть кода не убрать в функции?
0
585 / 488 / 371
Регистрация: 05.11.2013
Сообщений: 1,265
Записей в блоге: 6
19.11.2013, 06:39 3
Цитата Сообщение от vua72 Посмотреть сообщение
строки 24-29 просто бессмысленны
C++
1
2
3
4
5
6
7
8
int **a = NULL;
 
    a = new int * [height];
                
    for ( int i = 0; i < height; i ++ )
    {
        a[i] = new int [width];
    }
хм, я, конечно, не препод, и не автор сего кода, но ничего бессмысленного не вижу.
Это выделение памяти под матрицу размерности height * width
Знаете способ лучше - поделитесь
0
419 / 418 / 167
Регистрация: 28.11.2010
Сообщений: 1,183
19.11.2013, 10:35 4
Цитата Сообщение от ПерС Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
int **a = NULL;
 
    a = new int * [height];
                
    for ( int i = 0; i < height; i ++ )
    {
        a[i] = new int [width];
    }
хм, я, конечно, не препод, и не автор сего кода, но ничего бессмысленного не вижу.
Это выделение памяти под матрицу размерности height * width
Знаете способ лучше - поделитесь
ну-да, большой смысл в строках кода где создается двумерный массив с нулевыми размерностями. ТС так обходит проблему удаления массива в первом пункте меню Поэтому я и написал про логику программ, которая страдает.
1
585 / 488 / 371
Регистрация: 05.11.2013
Сообщений: 1,265
Записей в блоге: 6
19.11.2013, 13:46 5
Цитата Сообщение от vua72 Посмотреть сообщение
ну-да, большой смысл в строках кода где создается двумерный массив с нулевыми размерностями. ТС так обходит проблему удаления массива в первом пункте меню Поэтому я и написал про логику программ, которая страдает.
не обратил внимания, что изначально не заданы width и height
Ваше замечание ввело в заблуждение при беглом просмотре
теперь всё понятно, + за внимательность
0
3 / 3 / 4
Регистрация: 18.11.2013
Сообщений: 172
19.11.2013, 15:20  [ТС] 6
Цитата Сообщение от vua72 Посмотреть сообщение
У препода спросите, что он имеет в виду.
По коду, у вас логика работы программы страдает,
строки 24-29 просто бессмысленны
+ пишите вроде на Си, а выделение.освобождение памяти из С++
А вы функции уже учили? Почему бы часть кода не убрать в функции?
Функции не учил пока,и нужно все сделать, не применяя функции.Мне только,в принципе,можете объяснить,что означает промежуточное хранения данных, а дальше я сам справлюсь.А препод мне про это ничего не скажет,он жмот)))
0
19.11.2013, 15:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.11.2013, 15:20
Помогаю со студенческими работами здесь

Освободить память в стуктуре
Не могу четко освободить память. Где косяк и как ее правильно освободить? Сообщение Valgrind ...

Удалить связный список и освободить память
Вот так создаю связный список typedef struct { comp el; void* next; } list; list* first =...

Не могу освободить память с функцией free
int *get_vector(t_graph *begin, int **mat_adc, int n, int end) { int i; int ...

Как освободить память выделенную в подпрограмме
Имеется функция создания элемента списка struct list_int* create_elem(int num, int sqnum) { ...

Освободить память, выделенную под матрицу
Вот выделена память под массив двумерный: int **matrix; int size = 100; ...

Как освободить динамически выделенную память в структуре
Заголовочный файл myheader.h struct tagDate { int yy, mm, dd; }; struct tagGoods...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru