![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Освобождение строк.
Erik1 © (2006-03-29 11:50:00)Я сделал буфер для потоков который представляет из себя список:
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;
Erik1 (2006-03-29 13:02:00) [1]Странно по тестам 56 байт кудато деваются после каждой обработки.
begin...end (2006-03-29 12:50:00) [2]> Erik1 © (29.03.06 12:40) [4]
Извините, но для того, чтобы ответить на Ваш вопрос, вовсе не обязательно досканально представлять себе механизм работы менеджера памяти.
Более того — этот механизм здесь вообще ни при чём. Нужно выяснить, будет ли автоматически финализирована строка или нет. А то, как именно будет освобождена память (а это и есть внутренний механизм), в данном случае неважно.
Достаточно прочитать справку по FreeMem. И, может быть, для уверенности заглянуть в окно CPU.
Ega23 (2006-03-29 12:43:00) [3]Вроде всё нормально. Только лично я бы вместо record завёл бы class.
Erik1 (2006-03-29 12:40:00) [4]Большое спасибо.
По поводу переноса темы:
Вы бы еще ее в раздел для грудничков перенесли! Видать тут все гении и многопоточное прогамирование и внутрений механим менаджера памяти все знают как Отче наш.
MBo (2006-03-29 12:29:00) [5]не нужно ни SetLength, ни Finalize
Deka (2006-03-29 12:18:00) [6]Вроде правильно, только я бы предпочёл вместо SetLenght использовать Finalize.
MBo (2006-03-29 12:16:00) [7]Да, корректно. Dispose вызывает Finalize