Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/43: Рейтинг темы: голосов - 43, средняя оценка - 4.88
0 / 0 / 2
Регистрация: 26.01.2011
Сообщений: 96

Очистка динамической памяти

10.07.2011, 07:02. Показов 8239. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как очистить память в таком случае?
Выдаёт ошибку 204. Ошибочная операция с указателем.

Pascal
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
type spis=^tbook;
     {книги}
     book=record
     autor:array[1..12] of char;
     titleFIO:array[1..32] of char;
     publisher:array[1..16] of char;
     year:word;
     pages:word;
     end;
     {список книг}
     tbook=record
       data:book;
       pr,sl:spis;
     end;
...
{Процедура освобождения памяти занятой списком}
Procedure CleanSpisok(spis1:spis);
var
  tmp:spis;
begin
  while spis1<>nil do {пока spis1 не станет указывать в "пустоту" делать}
  begin
    tmp:=spis1; {указатель tmp направим на вершину списка}
    spis1:=spis1^.sl; {вершину списка перенесём на следующий за данной вершиной элемент}
    FreeMem(tmp,SizeOf(book)); {освободим память занятую под старую вершину}
  end;
end;
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.07.2011, 07:02
Ответы с готовыми решениями:

Очистка динамической памяти.
О, гуру, помогите мне, несведущему! Не получается полностью освободить динамическую память. Гугль курил. Предполагается освобождать...

Не могу вывести элементы из динамической памяти
написал прогу заполняет список 16ю элементами (динамическая память)потом должна их вывести и все.... все легко и просто но вот он их не...

Разместить элементы файла в динамической памяти
Создать файл, содержащий сведения о владельцах автомобилей: фамилия владельца, марка автомобиля и дата покупки. Разместить элементы файла в...

8
298 / 298 / 150
Регистрация: 07.05.2011
Сообщений: 592
10.07.2011, 08:26
Выкладывайте всю программу
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,168
10.07.2011, 09:44
Pascal
1
FreeMem(tmp,SizeOf(book));
Так не вся память освободится, а лишь часть, наверное нужно
Pascal
1
FreeMem(tmp,SizeOf(tbook));
1
0 / 0 / 2
Регистрация: 26.01.2011
Сообщений: 96
10.07.2011, 09:49  [ТС]
Приложил файлы.
Вот чего вообще пытаюсь сделать:
"Хранящуюся в файле base1.dat базу данных "Жизнь замечательных людей" загрузить в оперативную память компьютера и построить индексный массив, упорядочивающий данные по фамилиям замечательных людей, используя метод Хоара. Провести поиск по первым трем буквам фамилий в упорядоченной базе, из записей с одинаковым ключом сформировать очередь. Вывести содержимое очереди. Из записей очереди построить Б-дерево по другому ключу (год издания книги) и произвести поиск в дереве по запросу."

Всё до выделеного жирным вроде как работает, но с перебоями.
При поиске - создаю список с в первой строкой что-то непонятное. Туда чего попало лезет.
Собственно для этого пытаюсь и очистить список. Хотя возможно проблема не в этом...

Если можете посмотреть, буду рад любым советам-замечаниям-предложениям-посильной помощи!
Вложения
Тип файла: rar BASE1.rar (28.6 Кб, 11 просмотров)
Тип файла: rar ZHZL_.rar (4.6 Кб, 13 просмотров)
0
0 / 0 / 2
Регистрация: 26.01.2011
Сообщений: 96
10.07.2011, 10:25  [ТС]
Цитата Сообщение от Puporev Посмотреть сообщение
Pascal
1
FreeMem(tmp,SizeOf(book));
Так не вся память освободится, а лишь часть, наверное нужно
Pascal
1
FreeMem(tmp,SizeOf(tbook));
Кажится сработало. Но появилась другая проблема.
При первом вызове процедуры всё отлично.
При повторном - опять 204 (ошибочная работа с указателем).
Если не очищать - то выводит список как на приложенном скриншоте.
Какие-то очень странные... mouse... и т.д.
Миниатюры
Очистка динамической памяти  
0
0 / 0 / 2
Регистрация: 26.01.2011
Сообщений: 96
10.07.2011, 14:13  [ТС]
Цитата Сообщение от Doctor_Che Посмотреть сообщение
При первом вызове процедуры всё отлично.
При повторном - опять 204 (ошибочная работа с указателем).
Проблема не решилась.
При пеовом обращении список пуст и
Pascal
1
FreeMem(tmp,SizeOf(tbook))
не выполняется. При повторном обращении, когда список не пуст - ошибка 204.
Поможите други...
0
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
10.07.2011, 17:53
Doctor_Che, зачем в программе, в которой используются только типизированные данные, применять GetMem() ? - Чтобы была возможность побольше ошибок сделать?
---
В программе реализованы 2 процедуры, которые делают одно и тоже:
CleanSpisok() и destroy()
Причём, процедура CleanSpisok() спроектирована так, что она буквально провоцирует на ошибки при её вызовах. Для удаления списка надо оставить процедуру destroy(). А CleanSpisok() - вообще убрать из программы.
---
Вот, например, что происходит в начале процедуры Find():
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
  //Если список p существовал ранее - значит ссылка на него будет потеряна
  //и этот список окажется "мёртвым". - Т. к. после выполнения New(p) его адрес будет
  //неизвестен. И его нельзя ни использовать ни удалить.
  //New(p) делает следующее - выделяет новый участок памяти размером, который определён
  //типом указателя p. Затем указатель на этот вновь выделенный участок памяти
  //записывается в переменную p. Таким образом, прежние данные в переменной p пропадут.
  new(p);
  //Здесь гарантировано будет p<>nil, потому что
  //на предыдущей строке кода мы выделили память и указатель на этот блок памяти записали в
  //переменную p. Поэтому будет выполнен вызов CleanSpisok(p), который освободит только что
  //выделенную область в памяти.
  if p=nil then new(p) else CleanSpisok(p);
Этот код больше похож на диверсию. - Благодаря ему, теряется список, если этот список был уже создан. И после потери списка в переменную p записывается новый указатель на новую область памяти, которая сразу же снова отдаётся системе. А в p остаётся мусор - указатель на уже отданную область памяти, которая уже не принадлежит программе. После этого любые дальнейшие попытки работать со списком через укзатель p приведут к ошибкам доступа к памяти.
2
0 / 0 / 2
Регистрация: 26.01.2011
Сообщений: 96
11.07.2011, 00:27  [ТС]
Destroy() попытался реализовать как раз после неудачи с CleanSpisok(). Но там точно такая же проблема - ошибка 204.
Что то не так...
Pascal
1
2
3
4
5
6
7
8
9
10
procedure destroy(var spis1:spis);
var tmp:spis;
begin
while spis1<>nil do
 begin
  tmp:=spis1;
  spis1:=spis1^.sl;
  dispose(tmp);
 end;
end;
А при добавлении в список использую процедуру
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{Процедура добавления нового элемента в список}
procedure AddElemSpisok(var spis1:spis;znach1:book);
var
  tmp:spis;
begin
  if spis1=nil then {Проверяем не пуст ли список, если пуст, то }
  begin
    GetMem(spis1,sizeof(tbook));  {создаём его первый элемент}
    tmp:=spis1;
  end
  else {в случае если список не пуст}
  begin
    tmp:=spis1;
    while tmp^.sl<>nil do
      tmp:=tmp^.sl; {ставим tmp на последний элемент списка}
    GetMem(tmp^.sl,sizeof(tbook)); {создаём следующий элемент}
    tmp:=tmp^.sl;   {переносим tmp на новый элемент}
  end;
  tmp^.sl:=nil; {зануляем указатель}
  tmp^.data:=znach1; {заносим значение}
end;
Здесь ошибок не выдаёт, но к месту ли здесь GetMem(); ?
0
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
11.07.2011, 10:32
Цитата Сообщение от Doctor_Che Посмотреть сообщение
Но там точно такая же проблема - ошибка 204.
...
Здесь ошибок не выдаёт, но к месту ли здесь GetMem(); ?
Выделять/освобождать память надо только через соответствующие вызовы: New()/Dispose() либо через GetMem()/FreeMem(). Комбинировать вызовы так: New()/FreeMem() или GetMem()/Dispose() нельзя.
Предлагаю действовать только через New()/Dispose() - т. к., в программе имеются только типизированные данные.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.07.2011, 10:32
Помогаю со студенческими работами здесь

Запушить в ячейку динамической памяти через модуль
Не получается запушить в ячейку динамической памяти через модуль, постоянно находит ошибки. Вот и сейчас нашел ошибку в 19 строке основной...

Найти среднее арифметическое четных строк с использованием динамической памяти
Дан двумерный целочисленный массив, состоящий из случайных чисел. Найти среднее арифметическое каждой из строк, имеющих четные номера. Как...

Разместить элементы файла в динамической памяти в односвязном линейном списке
Задача &quot;Разместить элементы файла в динамической памяти в односвязном линейном списке. Из связного списка, содержащего целые числа, удалить...

Разместить в динамической памяти элементы, встречающиеся в текстовом файле один раз
Дан текстовый файл, содержащий целые числа, разделенные пробелом. Разместить в динамической памяти элементы, встречающиеся один раз

Создать в динамической памяти односвязный список типа «очередь» из случайных целых чисел
1. Создать в динамической памяти односвязный список типа «очередь» из случайных целых чисел . Организовать поиск заданного числа с заменой...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru