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

Массив: Освобождение выделенной памяти - C++

Восстановить пароль Регистрация
 
Forumhelp
1 / 1 / 0
Регистрация: 06.06.2013
Сообщений: 130
22.06.2013, 14:28     Массив: Освобождение выделенной памяти #1
Сказали переделать код, нужно что бы память освобождалась не в отдельной функции а как то по другому так и не понял как.

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
#include <iostream>
#include <cstdlib>
#include <ctime>
/* Prototipi */
int** createMatrix(int, int);
void fillMatrix(int**, int, int);
void printMatrix(int **, int, int);
int getIndexOfMinElement(int **, int, int);
void reverseFirstWithMin(int **, int, int);
void deleteMatrix(int **, int);
 
int main() {
  srand(time(0));                                     // Ustanavlivaem "Zerno" dlya randomnih chisel
  int n, m, index;
  std::cout << "n = ";
  std::cin >> n;                                      // Vvod n (n strok)
  std::cout << "m = ";
  std::cin >> m;                                      // Vvod m (m stolbcov)
  int **matrix = createMatrix(n, m);                  // Vizivaem funkciu createMatrix i prisvaivaem ukazatelu matrix rez-tat ee raboti
  fillMatrix(matrix, n, m);                           // zapolnyaem matricu
  printMatrix(matrix, n, m);                          // vivodim matricu
  index = getIndexOfMinElement(matrix, n, m);         // poluchaem index stroki gde nahoditsya minimalnij element
  reverseFirstWithMin(matrix, m, index);              // menyaem mestami
  printMatrix(matrix, n, m);                          // vivodim matricu
  deleteMatrix(matrix, n);                            // osvobojdaem pamyat
  return 0;
}
 
int** createMatrix(int n, int m) {
  int **matrix = new int*[n];                        // videlyaem pamyat pod stroki
  for(int i = 0; i < n; ++i)
    matrix[i] = new int[m];                          // videlyaem pamyat pod stolbci
  return matrix;                                     // vozvrashaem matricu(ukazatel na ukazateli) (ukazatel na stroki)
}
 
void fillMatrix(int **matrix, int n, int m) {
  for(int i = 0; i < n; ++i)                        // zapolnyaem matricu randomnimi chislami [1,9];
    for(int j = 0; j < m; ++j)
      matrix[i][j] = 1 + rand() % 9;
}
 
void printMatrix(int **matrix, int n, int m) {
  std::cout << "Matrix:" << std::endl;
  for(int i = 0; i < n; ++i) {
    for(int j = 0; j < m; ++j)
      std::cout << matrix[i][j] << ' ';               // Vovodim matricu
    std::cout << std::endl;
  }
  std::cout << std::endl;
}
 
int getIndexOfMinElement(int **matrix, int n, int m) {
  int min = matrix[0][1];                            // predpologaem 4to minimalnij element matrix[0][1]    
  int index = 0;                                     // index stroki s minimalnim elementom 0
  for(int i = 0; i < n; ++i) {
    for(int j = 0; j < m; ++j)
      if(min > matrix[i][j]) {                       // Esli min > matrix[i][j] to min = matrix[i][j];
        index = i;                                   // zapominaem index
        min = matrix[i][j];                          // obnovlyaem minimalnij element
      }
  }
  return index;                                     // vozvrashaem index
}
 
void reverseFirstWithMin(int **matrix, int m, int index) {
  if(index == 0)                                    // Esli index = 0 to 
    return;                                        // zakanchivaem rabotu funkcii
  for(int j = 0; j < m; ++j) {
    int tmp = matrix[0][j];                        // zakidivaem v tmp matrix[0][j]
    matrix[0][j] = matrix[index][j];               // teper mojem v nego zapisat matrix[index][j]
    matrix[index][j] = tmp;                        // a v matrix[index][j] = tmp (gde lejut matrix[0][j])
  }
}
 
void deleteMatrix(int **matrix, int n) {
  for(int i = 0; i < n; ++i)
    delete[] matrix[i];                           // osvobojdaem pamyat is pod ukazatelya na stolbci(elementi matrici)
  delete[] matrix;                                // osvobojdaem pamyat is pod ukazatelya na stroki
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
22.06.2013, 16:40     Массив: Освобождение выделенной памяти #2
Я понимаю когда люди сталкиваються с проблемой вывода в консоль и начинают писать транслитом (хоть я это и считаю плохим решением проблемы), но зачем вы комментарии то транслитом написали?

Почему освобождение памяти в функции преподавателю не понравилось ответить не могу, проглянув вижу что в этом плане всё ок и утечек памяти не будет ...
Forumhelp
1 / 1 / 0
Регистрация: 06.06.2013
Сообщений: 130
22.06.2013, 19:16  [ТС]     Массив: Освобождение выделенной памяти #3
Транслитом писал не я, но все же проблема не в этом. Учитель сказал должна быть следующая схема:
объявление переменных
выделение памяти
обработка ф-ии пользователя
освобождение памяти

Добавлено через 1 час 54 минуты
Есть какие то варианты решения?
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
22.06.2013, 19:23     Массив: Освобождение выделенной памяти #4
Цитата Сообщение от Gepar Посмотреть сообщение
Я понимаю когда люди сталкиваються с проблемой вывода в консоль и начинают писать транслитом (хоть я это и считаю плохим решением проблемы), но зачем вы комментарии то транслитом написали?
бывает программа пишется в одной среде, затем демонстрируется в другой, где все русские комментарии превращаются, например, в знаки вопроса или просто абракадабру. У меня так в институте бывало.
Forumhelp
1 / 1 / 0
Регистрация: 06.06.2013
Сообщений: 130
22.06.2013, 20:27  [ТС]     Массив: Освобождение выделенной памяти #5
По коду можно что то исправить??
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
22.06.2013, 22:28     Массив: Освобождение выделенной памяти #6
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
бывает программа пишется в одной среде, затем демонстрируется в другой, где все русские комментарии превращаются, например, в знаки вопроса или просто абракадабру. У меня так в институте бывало.
Такое может быть только в каком-то старье (по с++ из такого могу вспомнить только борланд с его турбо билдером) и то решаеться тем что в настройках программы ставиться вменяемая кодировка для файлов / сам файл сохраняеться в кодировке понимаемой средой. Я вообще не знаю каким надо быть извращенцем чтобы написать много текста транслитом и лениться найти норм. решение проблемы...

Цитата Сообщение от Forumhelp Посмотреть сообщение
По коду можно что то исправить??
Память выделяеться и освобождаеться правильно, работу остального не смотрел но если оно считает всё правильно значит там тоже хорошо, перечитайте разделы в какой-то книге по освобождению и выделению памяти и идите убеждать преподавателя что никаких утечек памяти там нет, да и вообще в таких программах освобождение памяти в самом конце это больше хороший тон чем реальная польза так как os всё равно при завершении процесса всё поосвобождает, это ладно бы ещё где-то в середине программы освободить какой ресурс памяти была необходимость.

Добавлено через 1 минуту
Цитата Сообщение от Forumhelp Посмотреть сообщение
Транслитом писал не я, но все же проблема не в этом.
Передайте ему что он извращенец, хотя то что писали не вы вас не оправдивает, даже наоборот
Цитата Сообщение от Forumhelp Посмотреть сообщение
Учитель сказал должна быть следующая схема:
Ну следуйте его схеме - перенесите выделение и освобождение памяти в main.
Forumhelp
1 / 1 / 0
Регистрация: 06.06.2013
Сообщений: 130
23.06.2013, 00:26  [ТС]     Массив: Освобождение выделенной памяти #7
Спасибо за помощь))

Вот исправил. Есть какие то замечания?

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
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <conio.h>
/* Prototipi */
int** createMatrix(int, int);
void fillMatrix(int**, int, int);
void printMatrix(int **, int, int);
int getIndexOfMinElement(int **, int, int);
void reverseFirstWithMin(int **, int, int);
 
 
int main() {
  srand(time(0));                                     
  int n, m, index;
  std::cout << "n = ";
  std::cin >> n;                                      
  std::cout << "m = ";
  std::cin >> m;                                      
  int **matrix = createMatrix(n, m);                 
  fillMatrix(matrix, n, m);                      
  printMatrix(matrix, n, m);                         
  index = getIndexOfMinElement(matrix, n, m);         
  reverseFirstWithMin(matrix, m, index);             
  printMatrix(matrix, n, m);                        
  for(int i = 0; i < n; ++i)
    delete[] matrix[i];                          
  delete[] matrix; 
  getch();                          
  return 0;
}
 
int** createMatrix(int n, int m) {
  int **matrix = new int*[n];                        
  for(int i = 0; i < n; ++i)
    matrix[i] = new int[m];                        
  return matrix;                                    
}
 
void fillMatrix(int **matrix, int n, int m) {
  for(int i = 0; i < n; ++i)                        
    for(int j = 0; j < m; ++j)
      matrix[i][j] = 1 + rand() % 9;
}
 
void printMatrix(int **matrix, int n, int m) {
  std::cout << "Matrix:" << std::endl;
  for(int i = 0; i < n; ++i) {
    for(int j = 0; j < m; ++j)
      std::cout << matrix[i][j] << ' ';               
    std::cout << std::endl;
  }
  std::cout << std::endl;
}
 
int getIndexOfMinElement(int **matrix, int n, int m) {
  int min = matrix[0][1];                                
  int index = 0;                                    
  for(int i = 0; i < n; ++i) {
    for(int j = 0; j < m; ++j)
      if(min > matrix[i][j]) {                      
        index = i;                                   
        min = matrix[i][j];                          
      }
  }
  return index;                                     
}
 
void reverseFirstWithMin(int **matrix, int m, int index) {
  if(index == 0)                                     
    return;                                        
  for(int j = 0; j < m; ++j) {
    int tmp = matrix[0][j];                        
    matrix[0][j] = matrix[index][j];               
    matrix[index][j] = tmp;                        
  }
}
kventin_zhuk
БНТУ ФИТР
 Аватар для kventin_zhuk
214 / 154 / 15
Регистрация: 26.12.2012
Сообщений: 382
23.06.2013, 00:32     Массив: Освобождение выделенной памяти #8
@Forumhelp, Вы сделали по сути то же самое - но вынесли это в функцию main(если это все изсенения что я узрел). Но и в прошлом варианте было все правильно - так что толку в этом нет. Видимо вы не правильно поняли друг друга.
Forumhelp
1 / 1 / 0
Регистрация: 06.06.2013
Сообщений: 130
23.06.2013, 00:46  [ТС]     Массив: Освобождение выделенной памяти #9
Возможно преподаватель имел ввиду именно второй вариант, его я, пожалуй, и оставлю)
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4922 / 2665 / 243
Регистрация: 29.11.2010
Сообщений: 7,420
23.06.2013, 04:13     Массив: Освобождение выделенной памяти #10
А я, пожалуй, поддержку препода. Если это не методы, созданные исключительно лишь для сокращения копирайта внутри классов, а также не фабрика, то функция не должна работать с памятью. Ибо createMatrix(int, int); приведет нас к утечке, мы обязаны принять вычисления функции. Есть правило: "Кто память выделяет, тот её и освобождает". Его и надо придерживаться. Исключения я написал выше. Конечно, это лишь точка зрения, но ладно здесь ф-ция и возврат динам. памяти используется лишь для формирования массива, но это могут сделать и по банальному незнанию, а, допустим, если все это дело внутри библиотеки? Откуда мы знаем, что перехваченный указатель нужно будет потом передать функции с оператором delete [] ? Привыкать надо с самого начала к правилу, что я выше описал.

@Forumhelp, вам желательно инструкции с функции createMatrix также перенести в main, если уж выносить и функцию освобождения памяти.
Forumhelp
1 / 1 / 0
Регистрация: 06.06.2013
Сообщений: 130
23.06.2013, 12:51  [ТС]     Массив: Освобождение выделенной памяти #11
@MrGluck, не получается инструкции с функции createMatrix перенести в main, можете написать как надо?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4922 / 2665 / 243
Регистрация: 29.11.2010
Сообщений: 7,420
23.06.2013, 13:34     Массив: Освобождение выделенной памяти #12
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
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <conio.h>
/* Prototipi */
void fillMatrix(int**, int, int);
void printMatrix(int **, int, int);
int getIndexOfMinElement(int **, int, int);
void reverseFirstWithMin(int **, int, int);
 
 
int main() {
  srand(time(0));
  int n, m, index;
  std::cout << "n = ";
  std::cin >> n;
  std::cout << "m = ";
  std::cin >> m;
  int **matrix = new int*[n];
  for(int i = 0; i < n; ++i)
    matrix[i] = new int[m];
  fillMatrix(matrix, n, m);
  printMatrix(matrix, n, m);
  index = getIndexOfMinElement(matrix, n, m);
  reverseFirstWithMin(matrix, m, index);
  printMatrix(matrix, n, m);
  for(int i = 0; i < n; ++i)
    delete[] matrix[i];
  delete[] matrix;
  getch();
  return 0;
}
 
void fillMatrix(int **matrix, int n, int m) {
  for(int i = 0; i < n; ++i)
    for(int j = 0; j < m; ++j)
      matrix[i][j] = 1 + rand() % 9;
}
 
void printMatrix(int **matrix, int n, int m) {
  std::cout << "Matrix:" << std::endl;
  for(int i = 0; i < n; ++i) {
    for(int j = 0; j < m; ++j)
      std::cout << matrix[i][j] << ' ';
    std::cout << std::endl;
  }
  std::cout << std::endl;
}
 
int getIndexOfMinElement(int **matrix, int n, int m) {
  int min = matrix[0][1];
  int index = 0;
  for(int i = 0; i < n; ++i) {
    for(int j = 0; j < m; ++j)
      if(min > matrix[i][j]) {
        index = i;
        min = matrix[i][j];
      }
  }
  return index;
}
 
void reverseFirstWithMin(int **matrix, int m, int index) {
  if(index == 0)
    return;
  for(int j = 0; j < m; ++j) {
    int tmp = matrix[0][j];
    matrix[0][j] = matrix[index][j];
    matrix[index][j] = tmp;
  }
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.06.2013, 13:43     Массив: Освобождение выделенной памяти
Еще ссылки по теме:

с++ Освобождение памяти C++
C++ Освобождение памяти, выделенной через new
Освобождение памяти, выделенной на динамический массив структур C++

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

Или воспользуйтесь поиском по форуму:
Forumhelp
1 / 1 / 0
Регистрация: 06.06.2013
Сообщений: 130
23.06.2013, 13:43  [ТС]     Массив: Освобождение выделенной памяти #13
@MrGluck, спасибо) Надеюсь преподаватель именно этого хотел)
Yandex
Объявления
23.06.2013, 13:43     Массив: Освобождение выделенной памяти
Ответ Создать тему
Опции темы

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