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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 5.00
s_ksuha
Сообщений: n/a
#1

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

04.10.2009, 21:16. Просмотров 2943. Ответов 7

Необходим написать функции выделения и освобождения памяти под двумерный динамический массив. Причем освобождение должн быть не сразу для всего массива, а чтобы была возможность освободить память одной строки массива. И как будет выглядеть передача параметров в функцию в 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++
здравствуйте господа. есть такой вопрос. пусть есть класс например Bitmap - несжатое растровое изображение. Пусть необходимо уметь...

Нюансы выделения и освобождения памяти (структуры) - C++
struct point { int a; point *next; } point *p=new point Я освобожу всю память которая отводилась под динам. структуру? delete...

Написать функции для работы с массивом - выделения/освобождения памяти, консольного ввода/вывода - C++
Напишите функции: 1) выделяющую память для массива данных типа float, 2) заполняющую ячейки данными с клавиатуры, 3) выводящую...

Необходим совет при освобождения памяти динамического массива - C++
Имеется код: -создание трехмерного динамического массива float ***Kadr; Kadr = new float **; for (int i = 0; i &lt; D-&gt;Np; i++)...

Применение Динамического выделения памяти - C++
Надо решить задачу написав функцию. Нужно выделить память использую malloc. Помогите Плиз..! Заранее Спасибо)) Дана матрица...

По поводу динамического выделения памяти - C++
Допустим, в программе вызывается функция SomeFunc(), описанная как void SomeFunc(){ int arr; //...do something } В...

7
M128K145
Эксперт С++
8293 / 3513 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
04.10.2009, 22:12 #2
Цитата Сообщение от s_ksuha Посмотреть сообщение
одной функцией для освобождения мне не удалось обойтись...
это нормально, потому как сначала удаляешь массивы-строки, а потом массив-столбец указателей на массивы-строки
0
Rififi
2359 / 1052 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
04.10.2009, 22:36 #3
s_ksuha,
одной функцией для освобождения мне не удалось обойтись...

обойтись можно, если ты одной функцией выделишь блок памяти, достаточный для хранения всех элементов массива + значения (m+1) указателей (a, a[0] .. a[m-1])
после аллокации необходимо вручную скорректировать адреса указателей. способ геморойный и не всегда оправданный.
0
kravam
быдлокодер
1700 / 887 / 45
Регистрация: 04.06.2008
Сообщений: 5,494
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;
}
0
novi4ok
551 / 504 / 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])
низзя потому что в условии стоит:
"чтобы была возможность освободить память одной строки массива."
что потом делать с этим массивом непонятно, но вот так им надо.
0
s_ksuha
Сообщений: n/a
05.10.2009, 08:27 #6
Цитата Сообщение от kravam Посмотреть сообщение
Не разбирался, ибо написано коряво, увы.
На, смотри. Может, натолкнёт на мысль.
таким был первоначальный вариант задачи! так и было, но теперь нужно написать функции для всего этого.
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
05.10.2009, 11:31 #7
альтернативно можно передавать в ф-ю удаления указатель на массив, индекс удаляемой строки и общее количество строк. и если освобождается последняя строка, освобождается и весь массив. но некрасиво. зато одной ф-ей.
некрасиво также то, что в принципе становится возможным удалить какую-нибудь строку, а остальные оставить жить. можно удалить строки, но оставить жить массив, можно удалить массив (имеется ввиду память указателей на строки), но оставить неосвобожденными строки и пр.
0
kravam
быдлокодер
1700 / 887 / 45
Регистрация: 04.06.2008
Сообщений: 5,494
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;
}
0
05.10.2009, 13:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.10.2009, 13:00
Привет! Вот еще темы с ответами:

Операторы динамического выделения памяти - new/delete - C++
Здравствуйте. Я немного не понимаю некоторый момент, связанный с динамическим выделением памяти, а именно - с объемом выделяемой...

Как написать программу для динамического выделения памяти с использованием new - C++
Надо написать прогу, которая выделяет память для структур размером в 2048 байт и обрабатывает ситуацию в случае ее нехватки. Я понятия не...

Сумма элементов первой и последней строчки матрицы с использованием динамического выделения памяти - C++
Количество строк и столбцов задается пользователем с клавиатуры. Элементы матрицы разместить в динамической памяти. Вычислить и сохранить...

Реализовать «массив целых чисел». Обработать ошибки динамического выделения памяти. Переопределить опе - C++
Реализовать класс «массив целых чисел». Обработать ошибки динамического выделения памяти. Переопределить оператор ++ для указателя на...


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

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

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