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

Функциии динамического выделения и освобождения памяти - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 5.00
s_ksuha
Сообщений: n/a
04.10.2009, 21:16     Функциии динамического выделения и освобождения памяти #1
Необходим написать функции выделения и освобождения памяти под двумерный динамический массив. Причем освобождение должн быть не сразу для всего массива, а чтобы была возможность освободить память одной строки массива. И как будет выглядеть передача параметров в функцию в main?
вот что получилось у меня, но я не понимаю почему это работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void create (double** &a, int m, int n)
{
    if (!(a = new double* [m])) exit(1); 
    for (int i=0; i<m; ++i)
        if (!(a[i] = new double [n])) exit(1); 
}
 
void del (double* a)
{
    delete [] a;
}
void del2 (double** a)
{
    delete [] a;
}
а вызов выглядит так:
C++
1
2
3
4
5
6
7
8
9
    
double** a ;
create(*&a,m,n);
.....
del(a[0]);
.....
for (int i=0; i<m-1; ++i)
     del (a[i]);
del2(a);
одной функцией для освобождения мне не удалось обойтись...
объясните, пожалуйста, либо подскажите альтернативный вариант!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.10.2009, 21:16     Функциии динамического выделения и освобождения памяти
Посмотрите здесь:

Применение Динамического выделения памяти C++
C++ Операторы динамического выделения памяти - new/delete
Нюансы выделения и освобождения памяти (структуры) C++
C++ Ошибка освобождения памяти new/delete
C++ Сумма элементов первой и последней строчки матрицы с использованием динамического выделения памяти
По поводу динамического выделения памяти C++
Как написать программу для динамического выделения памяти с использованием new C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
M128K145
Эксперт C++
 Аватар для M128K145
8276 / 3495 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
04.10.2009, 22:12     Функциии динамического выделения и освобождения памяти #2
Цитата Сообщение от s_ksuha Посмотреть сообщение
одной функцией для освобождения мне не удалось обойтись...
это нормально, потому как сначала удаляешь массивы-строки, а потом массив-столбец указателей на массивы-строки
Rififi
 Аватар для Rififi
2332 / 1047 / 43
Регистрация: 03.05.2009
Сообщений: 2,656
04.10.2009, 22:36     Функциии динамического выделения и освобождения памяти #3
s_ksuha,
одной функцией для освобождения мне не удалось обойтись...

обойтись можно, если ты одной функцией выделишь блок памяти, достаточный для хранения всех элементов массива + значения (m+1) указателей (a, a[0] .. a[m-1])
после аллокации необходимо вручную скорректировать адреса указателей. способ геморойный и не всегда оправданный.
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,300
04.10.2009, 22:53     Функциии динамического выделения и освобождения памяти #4
Не разбирался, ибо написано коряво, увы.
На, смотри. Может, натолкнёт на мысль.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
int main (){
 
 int chislo= 5;
 int drugoe_chislo= 5;
 
 //Память выделяем
 int** a= new int* [chislo]; 
 for (int i= 0; i< chislo; i++) {
  a [i]= new int [drugoe_chislo];
 }
 
 //пАМЯТЬОСВОБОждаем
 for (int i= 0; i< chislo; i++) {
  delete [] a [i];
 }
 delete [] a;
 return 0;
}
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
05.10.2009, 01:05     Функциии динамического выделения и освобождения памяти #5
почитай, довольно подробно описано:
http://www.ics.uci.edu/~dan/class/165/notes/memory.html

Добавлено через 1 минуту
Цитата Сообщение от Rififi Посмотреть сообщение
s_ksuha,
одной функцией для освобождения мне не удалось обойтись...

обойтись можно, если ты одной функцией выделишь блок памяти, достаточный для хранения всех элементов массива + значения (m+1) указателей (a, a[0] .. a[m-1])
низзя потому что в условии стоит:
"чтобы была возможность освободить память одной строки массива."
что потом делать с этим массивом непонятно, но вот так им надо.
s_ksuha
Сообщений: n/a
05.10.2009, 08:27     Функциии динамического выделения и освобождения памяти #6
Цитата Сообщение от kravam Посмотреть сообщение
Не разбирался, ибо написано коряво, увы.
На, смотри. Может, натолкнёт на мысль.
таким был первоначальный вариант задачи! так и было, но теперь нужно написать функции для всего этого.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
05.10.2009, 11:31     Функциии динамического выделения и освобождения памяти #7
альтернативно можно передавать в ф-ю удаления указатель на массив, индекс удаляемой строки и общее количество строк. и если освобождается последняя строка, освобождается и весь массив. но некрасиво. зато одной ф-ей.
некрасиво также то, что в принципе становится возможным удалить какую-нибудь строку, а остальные оставить жить. можно удалить строки, но оставить жить массив, можно удалить массив (имеется ввиду память указателей на строки), но оставить неосвобожденными строки и пр.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.10.2009, 13:00     Функциии динамического выделения и освобождения памяти
Еще ссылки по теме:

Стратегия выделения/освобождения памяти C++
Проверка освобождения памяти (new, delete) C++
C++ Реализовать «массив целых чисел». Обработать ошибки динамического выделения памяти. Переопределить опе
Написать функции для работы с массивом - выделения/освобождения памяти, консольного ввода/вывода C++
C++ Необходим совет при освобождения памяти динамического массива

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

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,300
05.10.2009, 13:00     Функциии динамического выделения и освобождения памяти #8
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
#include <iostream>
 
 //А вот функция освобождения памяти для каждой строки
void f_osv_mem(int* uk_na_stroku) {
 delete [] uk_na_stroku ;
}
 
int main (){
 
 int chislo= 5;
 int drugoe_chislo= 5;
 
 //Память выделяем
 int** a= new int* [chislo]; 
 for (int i= 0; i< chislo; i++) {
  a [i]= new int [drugoe_chislo];
 }
 
 //пАМЯТЬОСВОБОждаем. Для всех строк с помощью функции
 for (int i= 0; i< chislo; i++) {
  f_osv_mem( a [i]);
 }
 
 //Если бы нам надо было освободить память какой-нибудь одной иди двух строк, то
 //так написали бы
// f_osv_mem( a [0]);
// f_osv_mem( a [1]);
 
 
 
 //Ну и не забыть ещё так
 delete [] a;
 return 0;
}
Yandex
Объявления
05.10.2009, 13:00     Функциии динамического выделения и освобождения памяти
Ответ Создать тему

Метки
динамические, массивы
Опции темы

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