Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.04.2012, 04:26   #1
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,385
По умолчанию C++ Visual: динамический массив - free не освобождает память

Господа, подскажите - почему, когда я освобождаю память в динамическом массиве при помощи функции free, компилятор выдает ошибку и все отсылает меня к библиотекам?
Код:

double **arr;
int n=0;

cout<<"Vvedite razmernost masiva: "<<endl; //prosim polzovatelja vvesti razmernost massiva
cin>>n;//polushaem razmer massiva
arr = (double **) malloc (n*sizeof(double *));

for (int i=0; i < n; i++ )
{
	arr[i] = (double *) malloc(n*sizeof(double *));
}


for (int i = 0; i < n; i++)
{
	for (int j = 0; j< n; j++)
	{
		arr [i][j] = (double)(rand()%300-50)/10;
		cout<< arr[i][j]<<"  "; 
               free (arr[i]);//здесь ошибка
	}
free (arr);//здесь ошибка	
cout<<endl;
}
"Все мы жаждем чудес. Чисто человеческое свойство." Carl Sagan
Blondy вне форума Ответить с цитированием
Старый 28.04.2012, 04:33   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Код:
arr[i] = (double *) malloc(n*sizeof(double *));
Тут звезда у double лишняя
Код:
arr[i] = (double *) malloc(n*sizeof(double));
Код:
for (int i = 0; i < n; i++)
{
	for (int j = 0; j< n; j++)
	{
		arr [i][j] = (double)(rand()%300-50)/10;
		cout<< arr[i][j]<<"  "; 
               free (arr[i]);//здесь ошибка
	}
free (arr);//здесь ошибка
Тут оба free находятся внутри циклов. Вы по n раз удаляете одну и ту же память, чего делать нельзя.

Вероятнее всего, планировалось что-то вроде:
Код:
for (int i = 0; i < n; i++)
  for (int j = 0; j < n; j++) {
    arr[i][j] = (double)(rand()%300-50)/10;
    cout << arr[i][j] << " ";
  }

// Работа с массивом...

// Освобождение памяти
for (int i = 0; i < n; i++)
  free (arr[i]);
free (arr);

Последний раз редактировалось netrino; 28.04.2012 в 04:40.
netrino вне форума Ответить с цитированием
Старый 28.04.2012, 12:45   #3
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,385
По умолчанию

Спасибо! Все работает! Вы как всегда молодец!))Я Вам плюсик добавлю))

Не могли бы Вы мне разъяснить один момент - вот почему код для освобождения памяти в цикле for мы не берем в фигурные скобки?
"Все мы жаждем чудес. Чисто человеческое свойство." Carl Sagan
Blondy вне форума Ответить с цитированием
Старый 28.04.2012, 13:30   #4
AlexDark
Форумчанин
 
Аватар для AlexDark
 
Регистрация: 23.12.2011
Сообщений: 117
По умолчанию

Цитата:
Сообщение от Blondy Посмотреть сообщение
Спасибо! Все работает! Вы как всегда молодец!))Я Вам плюсик добавлю))

Не могли бы Вы мне разъяснить один момент - вот почему код для освобождения памяти в цикле for мы не берем в фигурные скобки?
Потому что сначала в цикле построчно по указателям удаляются массивы данных, а потом free (arr) удаляет массив указателей на указатели.
(см. организацию массивов в памяти).

for (int i = 0; i < n; i++)
{
free (arr[i]);
}
free (arr);
AlexDark вне форума Ответить с цитированием
Старый 28.04.2012, 14:00   #5
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Цитата:
вот почему код для освобождения памяти в цикле for мы не берем в фигурные скобки?
наверное потому, что там всего лишь одно действие в цикле, а не несколько (соответственно, лишь одна ";" на весь цикл).

в Си не силён - просьба сильно не заплёвывать))
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамический массив(Redim) Visual Basic. Army Помощь студентам 1 16.06.2011 20:27
Кэш память, или динамический массив? slips JavaScript, Ajax 1 07.09.2009 17:38
Почему Dispose не освобождает память? DeLorean Общие вопросы Delphi 4 08.04.2008 00:17