powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TidBytes как почистить?
28 сообщений из 28, показаны все 2 страниц
TidBytes как почистить?
    #39861049
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток.

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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
var
 Pack: TidByte;
begin
  ...
  UClient.SendBuffer(IPaddr, IPport, Pack);
  Pack:= nil;
 ...
end;



И менеджер памяти Windows мне говорит, что память не чиститься. Но у динамических массивов присвоение nil равносильно уничтожению или я не прав?
...
Рейтинг: 0 / 0
TidBytes как почистить?
    #39861055
Alexander Zuev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это ты с интерфейсами перепутал. Используй SetLength в 0.
...
Рейтинг: 0 / 0
TidBytes как почистить?
    #39861056
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Динамический массив сам почистится при выходе из метода..
Ну или SetLength(Pack, 0);
...
Рейтинг: 0 / 0
TidBytes как почистить?
    #39861059
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite, в доках написано, что SetLength и nil однозначны
...
Рейтинг: 0 / 0
TidBytes как почистить?
    #39861073
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну раз менеджер памяти говорит что не чистится...
А ReportMemoryLeaksOnShutdown := True не говорит об утечках при закрытии, то память у вас не утекает, а накапливается и не освобождается вовремя
...
Рейтинг: 0 / 0
TidBytes как почистить?
    #39861075
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite, в том то и дело, что fastmem молчит. При выходе я все чищу. Вы правы накапливается и не освобождается вовремя
...
Рейтинг: 0 / 0
TidBytes как почистить?
    #39861079
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значит дело не в Pack:= nil;
Ищите почему вы чистите только при выходе, а не во время работы...
...
Рейтинг: 0 / 0
TidBytes как почистить?
    #39861448
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чувствую, что накидаете на вентилятор, но куда деваться
сделан консольное приложение и не пойму почему память не чиститься?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
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.
...
Рейтинг: 0 / 0
TidBytes как почистить?
    #39861456
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а если сделать так, то память не растет.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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;



неужто очередь так гадко себя ведет?
...
Рейтинг: 0 / 0
TidBytes как почистить?
    #39861458
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
 SetLength(ar, SizeOf(PRec^));
...
Рейтинг: 0 / 0
TidBytes как почистить?
    #39861486
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,
1. выдает ошибку ваша запись
2. для Trecord все равно с "^" или без
...
Рейтинг: 0 / 0
TidBytes как почистить?
    #39861495
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня ваш код выпадает с Out of Memory
Хотя 9 Гб свободны
...
Рейтинг: 0 / 0
TidBytes как почистить?
    #39861496
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот если заменить
SetLength(ar, SizeOf(PRec));
на
SetLength(ar, SizeOf(TRec));
то работает
...
Рейтинг: 0 / 0
TidBytes как почистить?
    #39861497
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite, rio.2 win7 64
...
Рейтинг: 0 / 0
TidBytes как почистить?
    #39861498
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite, блин у меня и так и так работает
...
Рейтинг: 0 / 0
TidBytes как почистить?
    #39861503
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite, а память также около 300 мб?
...
Рейтинг: 0 / 0
TidBytes как почистить?
    #39861506
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет.. там где у вас строчка
//Удаляли удаляли, а толку ноль
у меня уже 8000 кб
...
Рейтинг: 0 / 0
TidBytes как почистить?
    #39861507
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все логично...
SizeOf(PRec) <> SizeOf(TRec)
4 <> 8
...
Рейтинг: 0 / 0
TidBytes как почистить?
    #39861508
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite, темные вычислительные силы. Буду в бубен бить. Спасибо за тесты
...
Рейтинг: 0 / 0
TidBytes как почистить?
    #39861509
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite, у меня и в первом и втором случае 8 и 8
...
Рейтинг: 0 / 0
TidBytes как почистить?
    #39861510
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Под Win64 да..
SizeOf(PRec) = 8, потому что 8 байт размер указателя..
Но вам просто повезло и совпало...
...
Рейтинг: 0 / 0
TidBytes как почистить?
    #39861511
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
win64 же)
...
Рейтинг: 0 / 0
TidBytes как почистить?
    #39861515
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В любом случае:
заполнили очередь = 40188 Кб
чистим очередь = 11212 Кб
Для остановки приложения нажмите <Enter> = 3100 Кб
...
Рейтинг: 0 / 0
TidBytes как почистить?
    #39861516
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо за советы!

еще бы разобраться с менеджером. почему у вас 8000 кб, а у меня 298000
...
Рейтинг: 0 / 0
TidBytes как почистить?
    #39861517
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня стандартный из коробки (встроенный fastmm)
...
Рейтинг: 0 / 0
TidBytes как почистить?
    #39861518
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в режиме Release нормально все отрабатывает. вот лошара(
...
Рейтинг: 0 / 0
TidBytes как почистить?
    #39861520
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Debug все то же самое ничего не изменилось....

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

и посмотрите что будет
...
Рейтинг: 0 / 0
TidBytes как почистить?
    #39861523
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite, это помогло
...
Рейтинг: 0 / 0
28 сообщений из 28, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TidBytes как почистить?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]