Форум: Форум C++Разное
Новые темы: 00
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Проблема с уничтожением двумерного динамического массива

Сообщения:  [1-6] 

 
 автор: cheops   (23.12.2007 в 06:29)   письмо автору
 
   для: buba3230   (23.12.2007 в 05:41)
 

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

  Ответить  
 
 автор: buba3230   (23.12.2007 в 05:41)   письмо автору
 
   для: cheops   (22.12.2007 в 17:26)
 

нам обьясняли немного не так, если не использовать [] то удаляется только первый елемент масива и с ним больше роботать нельзя но в памяти он остался(без 1го елемента). работать с остальными можна только через одреса памяти... но такого способа сам еще нигде не видел...

  Ответить  
 
 автор: cheops   (22.12.2007 в 17:26)   письмо автору
 
   для: graphoman   (22.12.2007 в 17:19)
 

Так утечку памяти не обнаружите - нужны специальные инструменты (если работаете в C++ Builder включите Code Guard) - дело в том, что Windows выделяя память для приложения, запоминает сколько и где памяти было выделено и после завершения работы эту память освобождает в принудительном порядке, даже если приложение не позаботилось об корректном освобождении памяти.
Утечки памяти страшны в двумя вещами:
1) для приложений, которые без перезагрузки пашут длительное время - такая проблема становится бичом в случае серверов - проработает сервер неделю, глядишь, а память всю выжрал - еле ворочается - приходится его перегружать, пока он опять её не наберёт.
2) Кроме того, при некорректном освобождении памяти - стандарт сообщает, что результат может быть не предсказуемым - т.е. 1000 раз память может быть освобождена без последствий, а на 1001 возникнет ошибка и выявить её будет черезвычайно сложно.

PS При помощи оператора delete освобождается память выделенная оператором new, если вы выделяете память при помощи оператора new [], освобождать её также следует при помощи оператора delete [].

  Ответить  
 
 автор: graphoman   (22.12.2007 в 17:19)   письмо автору
 
   для: cheops   (22.12.2007 в 16:28)
 

Программу исправил. Выглядит это так:

//...
char **words=new char *[n];
for (int i=0;i<n;i++)  words[i]= new char[10000];
//...
for (int i = 0; i < n; i++) delete[ ] words[i];
delete[ ]  words;


При этом заметил, что оператор delete[ ] работает и без пустых квадратных скобок. Чтобы в этом убедиться, я в диспетчере задач посмотрел размер файла подкачки до создания и после уничтожения динамического массива. При этом, результаты использования оператора delete[ ] были такми же, как и при использовании оператора delete.
Так в чем разница между delete[ ] и delete ?

  Ответить  
 
 автор: cheops   (22.12.2007 в 16:28)   письмо автору
 
   для: graphoman   (22.12.2007 в 13:21)
 

Массив удаляется не при помощи оператора delete, а при помощи оператора delete [], т.е. писать как минимум следует
for (int i = 0; i < n-1; i++) delete [] words[i]; /* ошибка! */
delete [] words;

  Ответить  
 
 автор: graphoman   (22.12.2007 в 13:21)   письмо автору
 
 

//Создал 2-мерный динамический массив

//...
//...
char **words=new char *[n];
words[0]=new char [n*m];
for (int i=1;i<m;i++)
{
words[i]=words[i-1]+m;
}

//теперь хочу освободить память
for (int i = 0; i < n-1; i++) delete words[i]; /* ошибка! */
delete words;

программа компилтруется и создает 2-ый массив.
В предпоследней строке происходить ошибка периода исполнения:

Expression _BLOCK_TYPE_IS_VAILID (pHead->nBlockUse)

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

  Ответить  

Сообщения:  [1-6] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования