|  | 
 
 | 
| 
			 
			#1  
			
			
			
			
		 | ||||
| 
 | ||||
|  Работа с памятью есть несколько нубоватых вопросов. 1. Как создать новый экземпляр для record'а, ну то есть есть переменная Р и в цикле для этой перменой должен создаваться новый экземпляр и добавляться в TList (ну или массив), New, GetMem или ещё что надо использовать? 2. Программа активно работает с большими текстами, все они хранятся в string переменных, из-за этого происходят утечки. Вопрос, как освободить память используемой строкой? | 
| 
			 
			#2  
			
			
			
			
		 | ||||
| 
 | ||||
|   Насколько я помню, если у тебя в структуре нет строк то достаточно New. Дельфи сам по типам определит количество необходимой памяти под новую переменную, а иначе придется еще выделять память GetMem под строку. И конечно освобождать память придется в обратном порядке. А вообще вот тут посмотрите, я там нечто похожее выкладывал: http://www.cyberforum.ru/post330460.html Последний раз редактировалось Страдалецъ, 16.11.2009 в 13:52. | 
| 
			 
			#3  
			
			
			
			
		 | |||
| 
 | |||
|   Код давай. Тут не телепаты собрались. По поводу освобождения памяти. 1. Освободить строку можно через вызов SetLength. 2. На самом деле память вернется в менеджер памяти программы. Если тебе надо именно отдать память системе, то копай в сторону API, там есть функция, которая позволяет это сделать (SetProcessWorkingSetSize Function) | 
| 
			 
			#4  
			
			
			
			
		 | ||||
| 
 | ||||
|   Цитата: 
  мне казалось я обьяснил нормально, лана вот пример: Код: type
  PMyRec = ^TMyRec;
  TMyRec = record
    var1: Integer;
    var2: Pointer;
  end;
...
procedure TForm1.DoIt();
var
  mylist: TList;
  p: TMyRec;
  i: Integer;
begin
  mylist := TList.Create;
  for i:=0 to 10 do
  begin
    {вот здесь надо создать новый экземпляр в переменную p, но как?}
    FillChar(p,SizeOf(TMyRec),$00);
    p.var1 := i;
    mylist.Add(@p);
  end;
  for i := 0 to mylist.Count - 1 do
    Memo1.Lines.Add(IntToStr(PMyRec(mylist[i])^.var1));
  {здесь в мемо выводится все 10, ну это, как я понимаю, изза того что все итемы в листе с одним адресом}
end; | 
| 
			 
			#5  
			
			
			
			
		 | ||||
| 
 | ||||
|   Код: begin
    {вот здесь надо создать новый экземпляр в переменную p, но как?}
    {ну вроде так}    
    New(P);  
    P^.Var1 := i;
    GetMem(P^.Var2, ...); //Тут надо указать размер ожидаемой переменной в Var2, если это будет строка, то Length(S)+1;
    P^.Var2 := ... //Собственно присвоение
    mylist.Add(@p);
  end; | 
| 
			 
			#6  
			
			
			
			
		 | ||||
| 
 | ||||
|   Страдалецъ, ещё раз спасиб. Только сёдня дошло что использовать PMyRec и к нему применять New, а не к TMyRec... |