Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.11.2009, 09:15
Аватар для AleD
AleD AleD вне форума
Активный
 
Регистрация: 21.02.2009
Адрес: г.Краснокаменск
Сообщения: 383
Репутация: 91
По умолчанию Работа с памятью

есть несколько нубоватых вопросов.
1. Как создать новый экземпляр для record'а, ну то есть есть переменная Р и в цикле для этой перменой должен создаваться новый экземпляр и добавляться в TList (ну или массив), New, GetMem или ещё что надо использовать?
2. Программа активно работает с большими текстами, все они хранятся в string переменных, из-за этого происходят утечки. Вопрос, как освободить память используемой строкой?
__________________
TAleD = class(TUser)
public
function HelpMe(ASubject, ARequest: String): String;
function GiveMeExample(ASubject: String): TStringList;
procedure WriteReview(APost: Integer; ADescription: TStringList);
end;
Ответить с цитированием
  #2  
Старый 16.11.2009, 13:42
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Насколько я помню, если у тебя в структуре нет строк то достаточно New. Дельфи сам по типам определит количество необходимой памяти под новую переменную, а иначе придется еще выделять память GetMem под строку. И конечно освобождать память придется в обратном порядке.
А вообще вот тут посмотрите, я там нечто похожее выкладывал:
http://www.cyberforum.ru/post330460.html
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 16.11.2009 в 13:52.
Ответить с цитированием
  #3  
Старый 16.11.2009, 15:23
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Код давай. Тут не телепаты собрались.

По поводу освобождения памяти.
1. Освободить строку можно через вызов SetLength.
2. На самом деле память вернется в менеджер памяти программы. Если тебе надо именно отдать память системе, то копай в сторону API, там есть функция, которая позволяет это сделать (SetProcessWorkingSetSize Function)
Ответить с цитированием
  #4  
Старый 16.11.2009, 16:40
Аватар для AleD
AleD AleD вне форума
Активный
 
Регистрация: 21.02.2009
Адрес: г.Краснокаменск
Сообщения: 383
Репутация: 91
По умолчанию

Цитата:
Сообщение от lmikle
...Тут не телепаты собрались...
да вообще, когда надо их нету мне казалось я обьяснил нормально, лана вот пример:
Код:
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;
__________________
TAleD = class(TUser)
public
function HelpMe(ASubject, ARequest: String): String;
function GiveMeExample(ASubject: String): TStringList;
procedure WriteReview(APost: Integer; ADescription: TStringList);
end;
Ответить с цитированием
  #5  
Старый 17.11.2009, 12:44
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Код:
begin
    {вот здесь надо создать новый экземпляр в переменную p, но как?}
    {ну вроде так}    
    New(P);  
    P^.Var1 := i;
    GetMem(P^.Var2, ...); //Тут надо указать размер ожидаемой переменной в Var2, если это будет строка, то Length(S)+1;
    P^.Var2 := ... //Собственно присвоение
    mylist.Add(@p);
  end;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #6  
Старый 17.11.2009, 13:06
Аватар для AleD
AleD AleD вне форума
Активный
 
Регистрация: 21.02.2009
Адрес: г.Краснокаменск
Сообщения: 383
Репутация: 91
По умолчанию

Страдалецъ, ещё раз спасиб. Только сёдня дошло что использовать PMyRec и к нему применять New, а не к TMyRec...
__________________
TAleD = class(TUser)
public
function HelpMe(ASubject, ARequest: String): String;
function GiveMeExample(ASubject: String): TStringList;
procedure WriteReview(APost: Integer; ADescription: TStringList);
end;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:13.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025