Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.16;
Скачать: CL | DM;

Вниз

Освобождение строк.   Найти похожие ветки 

 
Erik1 ©   (2006-03-29 11:50) [0]

Я сделал буфер для потоков который представляет из себя список:
MyBuf = record
 Value: String;
 _Time: Cardinal;
end;
Создаю record с поможю New освобождаю Dispose.
BufList.Put(Doc.GetLine); //добавляю сторку
BufList.Get(Value); //удаляю строку
Коректно ли удаляется строка(Item.Line) и освобождается память под нее?

Используеме процедуры.
procedure TBufList.Put(const Value: String);
Var
 DataBuf: PDataBuf;
begin
 FLock.BeginWrite;
 try
   New(DataBuf);
   DataBuf.Line := Value;
   DataBuf._Time := DateTimeToTimeStamp(Time).Time;
   fData.Add(DataBuf);
 finally
   FLock.EndWrite;
 end;
end;

function TBufList.Get(var Value: String): Boolean;
Var
 DataBuf: PDataBuf;
   i: Integer;
begin
 FLock.BeginWrite;
 try
   i := Count;
   Result := i > 0;
   if Result then
   begin
    Value := Items[i-1].Line;
    Delete(i-1);
   end;
 finally
   FLock.EndWrite;
 end;

end;

procedure TBufList.Delete(Index: Integer);
Var
   Item: PDataBuf;
begin
 Item := Items[Index];
 SetLength(Item.Line, 0);

 FData.Delete(Index);
 Dispose(Item);
 Item := nil;
end;


 
MBo ©   (2006-03-29 12:16) [1]

Да, корректно. Dispose вызывает Finalize


 
Deka ©   (2006-03-29 12:18) [2]

Вроде правильно, только я бы предпочёл вместо SetLenght использовать Finalize.


 
MBo ©   (2006-03-29 12:29) [3]

не нужно ни SetLength, ни Finalize


 
Erik1 ©   (2006-03-29 12:40) [4]

Большое спасибо.

По поводу переноса темы:
Вы бы еще ее в раздел для грудничков перенесли! Видать тут все гении и многопоточное прогамирование и внутрений механим менаджера памяти все знают как Отче наш.


 
Ega23 ©   (2006-03-29 12:43) [5]

Вроде всё нормально. Только лично я бы вместо record завёл бы class.


 
begin...end ©   (2006-03-29 12:50) [6]

> Erik1 ©   (29.03.06 12:40) [4]

Извините, но для того, чтобы ответить на Ваш вопрос, вовсе не обязательно досканально представлять себе механизм работы менеджера памяти.

Более того — этот механизм здесь вообще ни при чём. Нужно выяснить, будет ли автоматически финализирована строка или нет. А то, как именно будет освобождена память (а это и есть внутренний механизм), в данном случае неважно.

Достаточно прочитать справку по FreeMem. И, может быть, для уверенности заглянуть в окно CPU.


 
Erik1 ©   (2006-03-29 13:02) [7]

Странно по тестам 56 байт кудато деваются после каждой обработки.



Страницы: 1 вся ветка

Текущий архив: 2006.04.16;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.026 c
2-1144073348
dera
2006-04-03 18:09
2006.04.16
Я открываю модально форму, на которой есть грид...


1-1142427273
DelphiLexx
2006-03-15 15:54
2006.04.16
Отобразить Hint в нужном месте окна


15-1143099827
Der Nechk@ssoff
2006-03-23 10:43
2006.04.16
Windows Vista


5-1129377067
gde11
2005-10-15 15:51
2006.04.16
Не показываются в Instectore свойства внутреннего компонента.


2-1144083037
__alex
2006-04-03 20:50
2006.04.16
Чудеса с глобальными (public) переменными