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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.02.2011, 11:13   #1
Vyachek2010
Пользователь
 
Регистрация: 10.12.2010
Сообщений: 12
По умолчанию Проблема с освобождением памяти

Добрый день. Вот часть моей программа.

Код:
Type
 PInformationNode = ^TInformationForFireConstructor;
 TInformationForFireConstructor = record
  IndexElement: Integer;
  ListElement: TStringList;
  ListPins: TList;
 end;

 PInfromationGraphElement = ^TInfromationGraphElement;
 TInfromationGraphElement = record
  IndexID: Integer;
  TypeConstruction: Integer;
  InformationNode: PInformationNode;
 end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 TempStringList := TStringList.Create;
 TempList := TList.Create;
 TempList1 := TList.Create;
end;

// Создаю записи и помещая их в списки

procedure TForm1.btn4Click(Sender: TObject);
Var I : Integer;
    InfromationGraphElement, TempInfromationGraphElement : PInfromationGraphElement;
    InformationNode, InformationNode1 : PInformationNode;
    InformArc : PInformArc;
    InformationPrevGraphElement : PInformationPrevGraphElement;
begin
 for I := 0 to StrToInt(edt1.Text) - 1 do
  Begin
   New(InformationNode);
   InformationNode.IndexElement := I;
   InformationNode.ListElement := TStringList.Create;
   InformationNode.ListElement.Add('1212');
   InformationNode.ListElement.Add('2323');
   InformationNode.ListPins := TList.Create;

   TempList1.Add(InformationNode);

   New(InfromationGraphElement);
   InfromationGraphElement.IndexID := I;
   InfromationGraphElement.TypeConstruction := I;
   InfromationGraphElement.InformationNode := InformationNode;

   TempList.Add(InfromationGraphElement);
  End;
end;

// Удаляю записи из списка TempList
procedure TForm1.btn7Click(Sender: TObject);
Var I, J : Integer;
    InfromationGraphElement, TempInfromationGraphElement : PInfromationGraphElement;
    InformationNode : PInformationNode;
    InformArc : PInformArc;
    InformationPrevGraphElement : PInformationPrevGraphElement;
    Str :string;
begin
 for I := 0 to TempList.Count - 1 do
  Begin
   InfromationGraphElement := TempList.Items[I];

  // Не очищается память   
  //InfromationGraphElement.InformationNode := Nil;

   // очищается память, но приводит к проблемам при работе со списком   TempList1
   InformationNode := InfromationGraphElement.InformationNode;
   InformationNode.ListElement.Free;
   InformationNode.ListPins.Free;
   Dispose(InformationNode);

   Dispose(InfromationGraphElement);
  End;

 TempList.Free;
end;
Проблема в том, что для освобождения памяти необходимо в записи InfromationGraphElement удалять не ссылку на запись InformationNode (InfromationGraphElement.Informatio nNode), а саму запись InformationNode. Но здесь возникает проблема. Сама запись InformationNode храниться в списке TempList1 и при ее удалении из записи InfromationGraphElement возникают ошибки при работе в списке TempList1.
Пробовал просто удалить ссылку на эту запись InfromationGraphElement.Information Node := nil;, но память все равно не очищается. Что делать?

Последний раз редактировалось Vyachek2010; 07.02.2011 в 11:34.
Vyachek2010 вне форума Ответить с цитированием
Старый 07.02.2011, 13:38   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
возникают ошибки при работе в списке TempList1.
А какие это ошибки нам догадываться самим?
в 99% случаев знание текста ошибка на языке оригинала позволить получить ответ (или совет) в течении 5 минут. Или быстрее если воспользоваться поиском с текстом ошибки.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 07.02.2011 в 13:42.
evg_m вне форума Ответить с цитированием
Старый 07.02.2011, 13:55   #3
Vyachek2010
Пользователь
 
Регистрация: 10.12.2010
Сообщений: 12
По умолчанию

Когда обращаюсь к записям InformationNode возникает критическая ошибка.
Вот текст.
for I := 0 to TempList1.Count - 1 do
Begin
InformationNode := TempList1.Items[I];
Str := InformationNode.ListElement[0];
End;

Оно так и должно быть по идее потому что удаляется InformationNode.ListElement.Free;, но без этой строчки не хочет удаляться запись InfromationGraphElement т.е. память не очищается.
Мне нельзя убивать запись InformationNode поскольку она используется в списке TempList1 и используется дальше в программе, но если я ее не буду убивать т.е. не буду выполнять вот это:

InformationNode := InfromationGraphElement.Information Node;

InformationNode.ListElement.Free;

InformationNode.ListPins.Free;

Dispose(InformationNode);

то память при выполнении Dispose(InfromationGraphElement); не освобождается. а мне надо освободить при этом запись InformationNode не должна пострадать.

Последний раз редактировалось Vyachek2010; 07.02.2011 в 13:58.
Vyachek2010 вне форума Ответить с цитированием
Старый 07.02.2011, 14:02   #4
Vyachek2010
Пользователь
 
Регистрация: 10.12.2010
Сообщений: 12
По умолчанию

вместо вот этого

for I := 0 to TempList.Count - 1 do

Begin

InfromationGraphElement := TempList.Items[I];

InformationNode := InfromationGraphElement.Information Node;
InformationNode.ListElement.Free;
InformationNode.ListPins.Free;
Dispose(InformationNode);

Dispose(InfromationGraphElement);

End;

я пытался делать вот так

for I := 0 to TempList.Count - 1 do

Begin
InfromationGraphElement := TempList.Items[I];

InfromationGraphElement.Information Node := nil;

Dispose(InfromationGraphElement);

End;

но память при этом не очищается т.е. Dispose(InfromationGraphElement); выполняется но память как была занята так и остается.
Vyachek2010 вне форума Ответить с цитированием
Старый 07.02.2011, 14:09   #5
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Не?

Код:
procedure TForm1.btn7Click(Sender: TObject);
Var I: Integer;
    InfromationGraphElement: PInfromationGraphElement;
begin
 for I := 0 to TempList.Count - 1 do
  Begin
   InfromationGraphElement := TempList.Items[I];

   Dispose(InfromationGraphElement);
  End;

 TempList.Free;
end;
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 07.02.2011, 14:15   #6
Vyachek2010
Пользователь
 
Регистрация: 10.12.2010
Сообщений: 12
По умолчанию

Без вот этого

InformationNode := InfromationGraphElement.Information Node;
InformationNode.ListElement.Free;
InformationNode.ListPins.Free;
Dispose(InformationNode);

память не освобождается вообще
Vyachek2010 вне форума Ответить с цитированием
Старый 07.02.2011, 14:20   #7
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Какая память? И как ты это определяешь?

Я так понимаю, что ты хочешь очистить список TempList, но не трогать список TempList1.

Вот я тебе и привёл код.

Если ты используешь
Код:
InformationNode := InfromationGraphElement.Information Node;
InformationNode.ListElement.Free;
InformationNode.ListPins.Free;
Dispose(InformationNode);
то ты чистишь данные списка TempList1, но не очищаешь сам список TempList1.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 07.02.2011, 14:40   #8
Vyachek2010
Пользователь
 
Регистрация: 10.12.2010
Сообщений: 12
По умолчанию

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
Какая память? И как ты это определяешь?

Я так понимаю, что ты хочешь очистить список TempList, но не трогать список TempList1.

Вот я тебе и привёл код.

Если ты используешь
Код:
InformationNode := InfromationGraphElement.Information Node;
InformationNode.ListElement.Free;
InformationNode.ListPins.Free;
Dispose(InformationNode);
то ты чистишь данные списка TempList1, но не очищаешь сам список TempList1.

когда я сделаю TempList.Free я удалю только ячейки TempList но не удалю записи InfromationGraphElement которые я помещал в этот список. Мне нужно удалить все записи InfromationGraphElement и почистить список TempList.

При удалении записи InfromationGraphElement я должен удалить запись InformationNode которую я присваиваю в запись InfromationGraphElement.
Если я не буду удалять запись InformationNode то память не будет освобождаться. Основной объем памяти занимают записи InfromationGraphElement и в первую очередь надо удалить их из памяти а потом чистить TempList.
При удалении InfromationGraphElement я удаляю и InformationNode а мне этого не надо поскольку InformationNode используется дальше в программе и списке TempList1.
В том коде что ты мне привел запись InfromationGraphElement не удаляется физически из памяти, из-за того что в этой записи есть указатель на InformationNode и пока InformationNode не будет удален запись InfromationGraphElement не будет выгружена из памяти (физически). А мне нельзя удалять запись InformationNode, мне надо как-то разорвать связь между InfromationGraphElement и InformationNode, а потом уже удалять саму запись InfromationGraphElement.

Последний раз редактировалось Vyachek2010; 07.02.2011 в 14:47.
Vyachek2010 вне форума Ответить с цитированием
Старый 07.02.2011, 14:42   #9
Vyachek2010
Пользователь
 
Регистрация: 10.12.2010
Сообщений: 12
По умолчанию

как удаляется память смотрю по диспетчеру задач в процессах
Vyachek2010 вне форума Ответить с цитированием
Старый 07.02.2011, 15:13   #10
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от Vyachek2010 Посмотреть сообщение
когда я сделаю TempList.Free я удалю только ячейки TempList но не удалю записи InfromationGraphElement которые я помещал в этот список. Мне нужно удалить все записи InfromationGraphElement и почистить список TempList.
И что, по-твоему, в этом сообщении делать цикл? Именно это.

Цитата:
Сообщение от Vyachek2010 Посмотреть сообщение
Если я не буду удалять запись InformationNode то память не будет освобождаться. Основной объем памяти занимают записи InfromationGraphElement и в первую очередь надо удалить их из памяти а потом чистить TempList.

При удалении InfromationGraphElement я удаляю и InformationNode а мне этого не надо поскольку InformationNode используется дальше в программе и списке TempList1.
У тебя первый абзац противоречит второму. Либо ты удаляешь элементы TempList1 (aka InformationNode), либо нет. Ты уж как-то определись что тебе надо.

Цитата:
Сообщение от Vyachek2010 Посмотреть сообщение
В том коде что ты мне привел запись InfromationGraphElement не удаляется физически из памяти
Та ты што? Прям физически?

Цитата:
Сообщение от Vyachek2010 Посмотреть сообщение
из-за того что в этой записи есть указатель на InformationNode и пока InformationNode не будет удален запись InfromationGraphElement не будет выгружена из памяти (физически)
Это бред. Рекомендую к изучению мат-часть.

Цитата:
Сообщение от Vyachek2010 Посмотреть сообщение
А мне нельзя удалять запись InformationNode, мне надо как-то разорвать связь между InfromationGraphElement и InformationNode, а потом уже удалять саму запись InfromationGraphElement.
Поскольку никакой связи между ними (на уровне выделения памяти, как ты подумал) не существует вовсе, то и разрывать попросту нечего. Поэтому достаточно только Dispose. Как я и указал здесь.

Цитата:
Сообщение от Vyachek2010 Посмотреть сообщение
как удаляется память смотрю по диспетчеру задач в процессах
Кто-то здесь совсем не понимает, как выделяется память в программах. Читать.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кольцевая очередь на массиве в статической памяти с элементами в динамической памяти ]tach[ Общие вопросы C/C++ 1 19.01.2011 13:16
Проблема с утечкой памяти ExPeL Win Api 4 21.10.2010 22:13
Проблема с виделением памяти! FreTFuL Общие вопросы C/C++ 1 07.05.2010 20:23
самописный assert: проблема с утечкой памяти) sashonk Общие вопросы C/C++ 2 26.04.2010 15:58
Проблема выделения динамической памяти в С++ oxygen90 Помощь студентам 3 14.09.2009 21:47