|
|
|
|
|
для: buba3230
(23.12.2007 в 05:41)
| | Ну в общем да - однако это не очень хорошо, так как указателя у вас нет, а неосвобождённая память висит - это называется утечкой памяти, т.е. если вам ещё понадобится память и вы её опять так же освободите, то приложение будет набирать и набирать память пока её вообще не останется. Такая ситуация называется утечкой памяти - она не очень страшна, для приложений, работающих несколько минут, но крайне опасна для резидентных программ. | |
|
|
|
|
|
|
|
для: cheops
(22.12.2007 в 17:26)
| | нам обьясняли немного не так, если не использовать [] то удаляется только первый елемент масива и с ним больше роботать нельзя но в памяти он остался(без 1го елемента). работать с остальными можна только через одреса памяти... но такого способа сам еще нигде не видел... | |
|
|
|
|
|
|
|
для: graphoman
(22.12.2007 в 17:19)
| | Так утечку памяти не обнаружите - нужны специальные инструменты (если работаете в C++ Builder включите Code Guard) - дело в том, что Windows выделяя память для приложения, запоминает сколько и где памяти было выделено и после завершения работы эту память освобождает в принудительном порядке, даже если приложение не позаботилось об корректном освобождении памяти.
Утечки памяти страшны в двумя вещами:
1) для приложений, которые без перезагрузки пашут длительное время - такая проблема становится бичом в случае серверов - проработает сервер неделю, глядишь, а память всю выжрал - еле ворочается - приходится его перегружать, пока он опять её не наберёт.
2) Кроме того, при некорректном освобождении памяти - стандарт сообщает, что результат может быть не предсказуемым - т.е. 1000 раз память может быть освобождена без последствий, а на 1001 возникнет ошибка и выявить её будет черезвычайно сложно.
PS При помощи оператора delete освобождается память выделенная оператором new, если вы выделяете память при помощи оператора new [], освобождать её также следует при помощи оператора delete []. | |
|
|
|
|
|
|
|
для: 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 ? | |
|
|
|
|
|
|
|
для: graphoman
(22.12.2007 в 13:21)
| | Массив удаляется не при помощи оператора delete, а при помощи оператора delete [], т.е. писать как минимум следует
for (int i = 0; i < n-1; i++) delete [] words[i]; /* ошибка! */
delete [] words; |
| |
|
|
|
|
|
|
| //Создал 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)
Подскажите пожалуйства, в чем заключается ошибка, или как правильно создавать двумерные (в частности, многомерные) динамические массивы. | |
|
|
|
|