dimitriy7
![](http://forum.ru-board.com/board/avatars/private/dimitriy7.gif)
BANNED | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Да я вроде не про то... Просто сначала идет new(b); и под b^ выделяется область памяти. Потом b:=matr(a,10,10); и указатель b начинает смотреть уже в другое место - туда, где ф-ция matr создала свою переменную c^ (new(c) внутри ф-ции и возврат адреса c^ в основную программу). dispose(b); высвободит память по НОВОМУ адресу в b, а область памяти, изначально выделенная оператором new(b) так и числится как-бы занятой - до завершения всей программы... А если сделать b:=matr() несколько раз подряд перед единственным dispose(b) , то вообще расход памяти станет немыслимым - в данном конкретном случае теряем по 56 кб при каждом вызове matr() (собственно, поэтому и заинтересовался - эта злополучная matr() работала в цикле и здорово сжирала память) И memavail это четко показывает, первым делом проверил - иначе стал бы писать... По идее, new(b) вообще делать не надо, а dispose(b) как раз надо делать столько раз, сколько вызываем matr() - тогда все хорошо. Только вот почему компиляторы никак не среагировали? Хоть бы предупреждение какое выдали - о потере указателя, ведущего в неосвобожденную область памяти... PS Пишу все это в надежде, что начинающие программисты прочитают о возможности допустить такую ошибку при динамическом выделении памяти и не будут наступать на подобные грабли... А то один уже наступил - к экзамену не допущен ) Добавлено: Цитата: знаешь сколько попервоначалу было противников у циклов с пред- и постусловием? | А то! И не только поначалу... Даже в 2000-2001 в институте нам преподаватель попросту запрещал использовать while...do без объяснения причины. (зато против goto он ничего не имел - а некоторые, как слышал, делать переходы запрещают... ) Так что все это дело вкуса - кому как удобнее |