Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 TidBytes как почистить?  [new]
cptngrb
Member

Откуда:
Сообщений: 385
Доброго времени суток.

Есть у меня процедура отправки udp пакетов

var
 Pack: TidByte;
begin
  ...
  UClient.SendBuffer(IPaddr, IPport, Pack);
  Pack:= nil;
 ...
end;


И менеджер памяти Windows мне говорит, что память не чиститься. Но у динамических массивов присвоение nil равносильно уничтожению или я не прав?
12 сен 19, 16:00    [21969610]     Ответить | Цитировать Сообщить модератору
 Re: TidBytes как почистить?  [new]
Alexander Zuev
Member

Откуда:
Сообщений: 17
Это ты с интерфейсами перепутал. Используй SetLength в 0.
12 сен 19, 16:04    [21969618]     Ответить | Цитировать Сообщить модератору
 Re: TidBytes как почистить?  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1579
Динамический массив сам почистится при выходе из метода..
Ну или SetLength(Pack, 0);
12 сен 19, 16:05    [21969619]     Ответить | Цитировать Сообщить модератору
 Re: TidBytes как почистить?  [new]
cptngrb
Member

Откуда:
Сообщений: 385
X-Cite, в доках написано, что SetLength и nil однозначны
12 сен 19, 16:07    [21969622]     Ответить | Цитировать Сообщить модератору
 Re: TidBytes как почистить?  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1579
Ну раз менеджер памяти говорит что не чистится...
А ReportMemoryLeaksOnShutdown := True не говорит об утечках при закрытии, то память у вас не утекает, а накапливается и не освобождается вовремя
12 сен 19, 16:30    [21969642]     Ответить | Цитировать Сообщить модератору
 Re: TidBytes как почистить?  [new]
cptngrb
Member

Откуда:
Сообщений: 385
X-Cite, в том то и дело, что fastmem молчит. При выходе я все чищу. Вы правы накапливается и не освобождается вовремя
12 сен 19, 16:32    [21969644]     Ответить | Цитировать Сообщить модератору
 Re: TidBytes как почистить?  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1579
Значит дело не в Pack:= nil;
Ищите почему вы чистите только при выходе, а не во время работы...
12 сен 19, 16:35    [21969649]     Ответить | Цитировать Сообщить модератору
 Re: TidBytes как почистить?  [new]
cptngrb
Member

Откуда:
Сообщений: 385
чувствую, что накидаете на вентилятор, но куда деваться
сделан консольное приложение и не пойму почему память не чиститься?

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  FastMM4 in 'FastMM4.pas',
  FastMM4Messages in 'FastMM4Messages.pas',
  System.SysUtils,
  IdGlobal,
  System.Generics.Collections,
  System.SyncObjs;

type
  TRec = packed record
    num1: uint32;
    num2: uint16;
    num3: uint16;
  end;

 PRec = ^TRec;

 TQueueAr = class(TObject)
    private
      FQ: TQueue<TIdBytes>;
      FCS: TCriticalSection;
    public
      constructor Create(const ACapacity: integer); overload;
      destructor Destroy(); override;
      function PopRecord: TIdBytes;
      procedure PushRecord(const AObject: TIdBytes);
      function Count: Integer;
  end;

function TQueueAr.Count: Integer;
begin
  Result:= FQ.Count;
end;

constructor TQueueAr.Create(const ACapacity: integer);
begin
  inherited Create;
  FCS:= TCriticalSection.Create;
  FQ:= TQueue<TIdBytes>.Create;
  FQ.Capacity:= ACapacity;
end;

destructor TQueueAr.Destroy;
begin
  try
    FCS.Free;
    FQ.Free;
  finally
    inherited;
  end;
end;

function TQueueAr.PopRecord: TIdBytes;
begin
  FCS.Enter;
  try
    if FQ.Count = 0  then  Result:= nil
    else Result:= FQ.Dequeue;
  finally
    FCS.Leave;
  end;
end;

procedure TQueueAr.PushRecord(const AObject: TIdBytes);
begin
  FCS.Enter;
  try
    FQ.Enqueue(AObject);
  finally
    FCS.Leave;
  end;
end;

var
  QUEUE_AR: TQueueAr;


procedure SetVal(R: TidBytes; const ANumber1: uint32; const ANumber2, ANumber3: uint16);
begin
    PRec(@R[0])^.num1 := ANumber1;
    PRec(@R[0])^.num2 := ANumber2;
    PRec(@R[0])^.num3 := ANumber3;
end;

procedure Test;
var
 ar: TidBytes;
 i: integer;
begin
  for i := 1 to 1000000 do begin
   SetLength(ar, SizeOf(PRec));
   SetVal(ar, i, 222, 333);
   QUEUE_AR.PushRecord(ar);
  end;
  sleep(1000);
end;

function GetPacket: TIdBytes;
begin
  Result:= nil;
  if QUEUE_AR.count = 0 then exit;
  Result:= QUEUE_AR.PopRecord;
end;

procedure Run;
var
  ar: TIdBytes; 
begin
  ar:= GetPacket;
  if ar= nil then exit;
  ar:= nil;
end;

begin
  ReportMemoryLeaksOnShutdown:= True;
  writeln('заполням очередь');
  readln;   //ОП 6532кБ
  QUEUE_AR:= TQueueAr.Create(1000);
  test;
  writeln('QUEUE_AR.Count = ' + QUEUE_AR.Count.ToString);
  writeln('заполнили очередь');
  readln;  //ОП 298048 кБ
  WriteLn('Clear');
  while QUEUE_AR.Count <> 0 do
  Run; //Удаляли удаляли, а толку ноль
  writeln('QUEUE_AR.Count = ' + QUEUE_AR.Count.ToString);
  writeln('чистим очередь');
  readln;  // //ОП 298048 кБ
  QUEUE_AR.FQ.Clear;
  QUEUE_AR.FQ.TrimExcess;


  Writeln('Для остановки приложения нажмите <Enter>...');
    ReadLn; //289976 кБ
  QUEUE_AR.Free;
end.
13 сен 19, 12:37    [21970250]     Ответить | Цитировать Сообщить модератору
 Re: TidBytes как почистить?  [new]
cptngrb
Member

Откуда:
Сообщений: 385
а если сделать так, то память не растет.

for i := 1 to 10 do begin

  test;
//  writeln('QUEUE_AR.Count = ' + QUEUE_AR.Count.ToString);
//  writeln('заполнили очередь');
//  readln;  //ОП 298048кБ
//  WriteLn('Clear');
  while QUEUE_AR.Count <> 0 do
  Run; //Удаляли удаляли, а толку ноль

  end;


неужто очередь так гадко себя ведет?
13 сен 19, 12:46    [21970258]     Ответить | Цитировать Сообщить модератору
 Re: TidBytes как почистить?  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11196
 SetLength(ar, SizeOf(PRec^));
13 сен 19, 12:52    [21970260]     Ответить | Цитировать Сообщить модератору
 Re: TidBytes как почистить?  [new]
cptngrb
Member

Откуда:
Сообщений: 385
_Vasilisk_,
1. выдает ошибку ваша запись
2. для Trecord все равно с "^" или без
13 сен 19, 13:33    [21970295]     Ответить | Цитировать Сообщить модератору
 Re: TidBytes как почистить?  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1579
У меня ваш код выпадает с Out of Memory
Хотя 9 Гб свободны
13 сен 19, 13:42    [21970307]     Ответить | Цитировать Сообщить модератору
 Re: TidBytes как почистить?  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1579
А вот если заменить
SetLength(ar, SizeOf(PRec));
на
SetLength(ar, SizeOf(TRec));
то работает
13 сен 19, 13:44    [21970311]     Ответить | Цитировать Сообщить модератору
 Re: TidBytes как почистить?  [new]
cptngrb
Member

Откуда:
Сообщений: 385
X-Cite, rio.2 win7 64
13 сен 19, 13:44    [21970313]     Ответить | Цитировать Сообщить модератору
 Re: TidBytes как почистить?  [new]
cptngrb
Member

Откуда:
Сообщений: 385
X-Cite, блин у меня и так и так работает
13 сен 19, 13:45    [21970314]     Ответить | Цитировать Сообщить модератору
 Re: TidBytes как почистить?  [new]
cptngrb
Member

Откуда:
Сообщений: 385
X-Cite, а память также около 300 мб?
13 сен 19, 13:47    [21970321]     Ответить | Цитировать Сообщить модератору
 Re: TidBytes как почистить?  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1579
Нет.. там где у вас строчка
//Удаляли удаляли, а толку ноль
у меня уже 8000 кб
13 сен 19, 13:48    [21970324]     Ответить | Цитировать Сообщить модератору
 Re: TidBytes как почистить?  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1579
Все логично...
SizeOf(PRec) <> SizeOf(TRec)
4 <> 8
13 сен 19, 13:49    [21970326]     Ответить | Цитировать Сообщить модератору
 Re: TidBytes как почистить?  [new]
cptngrb
Member

Откуда:
Сообщений: 385
X-Cite, темные вычислительные силы. Буду в бубен бить. Спасибо за тесты
13 сен 19, 13:50    [21970327]     Ответить | Цитировать Сообщить модератору
 Re: TidBytes как почистить?  [new]
cptngrb
Member

Откуда:
Сообщений: 385
X-Cite, у меня и в первом и втором случае 8 и 8
13 сен 19, 13:51    [21970328]     Ответить | Цитировать Сообщить модератору
 Re: TidBytes как почистить?  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1579
Под Win64 да..
SizeOf(PRec) = 8, потому что 8 байт размер указателя..
Но вам просто повезло и совпало...
13 сен 19, 13:51    [21970329]     Ответить | Цитировать Сообщить модератору
 Re: TidBytes как почистить?  [new]
cptngrb
Member

Откуда:
Сообщений: 385
win64 же)
13 сен 19, 13:51    [21970330]     Ответить | Цитировать Сообщить модератору
 Re: TidBytes как почистить?  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1579
В любом случае:
заполнили очередь = 40188 Кб
чистим очередь = 11212 Кб
Для остановки приложения нажмите <Enter> = 3100 Кб
13 сен 19, 13:53    [21970335]     Ответить | Цитировать Сообщить модератору
 Re: TidBytes как почистить?  [new]
cptngrb
Member

Откуда:
Сообщений: 385
спасибо за советы!

еще бы разобраться с менеджером. почему у вас 8000 кб, а у меня 298000
13 сен 19, 13:53    [21970336]     Ответить | Цитировать Сообщить модератору
 Re: TidBytes как почистить?  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1579
У меня стандартный из коробки (встроенный fastmm)
13 сен 19, 13:55    [21970337]     Ответить | Цитировать Сообщить модератору
 Re: TidBytes как почистить?  [new]
cptngrb
Member

Откуда:
Сообщений: 385
в режиме Release нормально все отрабатывает. вот лошара(
13 сен 19, 13:56    [21970338]     Ответить | Цитировать Сообщить модератору
 Re: TidBytes как почистить?  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1579
В Debug все то же самое ничего не изменилось....

Уберите
FastMM4 in 'FastMM4.pas',
FastMM4Messages in 'FastMM4Messages.pas'

и посмотрите что будет
13 сен 19, 13:58    [21970340]     Ответить | Цитировать Сообщить модератору
 Re: TidBytes как почистить?  [new]
cptngrb
Member

Откуда:
Сообщений: 385
X-Cite, это помогло
13 сен 19, 13:58    [21970343]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Delphi Ответить