powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
25 сообщений из 26, страница 1 из 2
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
    #39621261
Салями
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не могу понять где именно проблема. VCL, Токио.

Скачиваю текст через IdHTTP, засовываю его в TJSONObject, разбираю что мне надо, генерирую запрос при помощи Format() и конкатенаций, отправляю в БД через ADODB.Connection.
Цикл повторяет итерации "пока есть задания", разделил на отдельные методы, переменные в основном локальные. Часто вызывается TJSONObject.GetValue() и Format() с константной в первом параметре.
Ну ещё в одном методе есть локальная переменная "array of Int64" размером например 2500.

Вот работает часа три-четыре - и вылетает с EOutOfMemory. Но в Диспетчере у приложения пишет всего 150-200 метров памяти занято. Вроде память не хапаю, вроде всё что брал освобождаю, а остальное само должно.
Отладчик показывает в какие-то левые строки кода и в kernel. Как раскопать-то причину? В зависимости от скорости скачивания, объёма файла и скорости разбора - чтоб повторить ошибку мне надо часа 4 ждать...
Я уже от балды перепробовал ставить передачу параметров в методах как Var и как Const - не влияет.

Может надо было полученное от TJSONObject.GetValue() как-то явно освобождать?
Или может Format(CONST_STRING, [...]) нельзя?
Или может Format(... , [SomeMethod()]) нельзя?
Или может Var:=Format(... , [Var]) нельзя?
Или может стоит массив Int64 вынести куда-то внаружу? Но почему?

Я просто уже препрочитал свой код раз 40 - и не вижу где может быть проблема. Уже во всём чём попало сомневаюся. А вот чего отладчик показывает мимо?
Попытался наколеночного кода добавить - тепеть на вызов метода кажет, а судя по наколеночному коду метод отработал полностью. Проблема типа при выхое из метода?
...
Рейтинг: 0 / 0
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
    #39621263
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FastMM может и через 10 минут работы показать место утечки.

https://stackoverflow.com/questions/8601504/how-to-enable-full-debug-mode-in-fastmm4
...
Рейтинг: 0 / 0
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
    #39621305
Салями
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
гм... Спасибо, попробуем... После того как оно снова вылетит... Я такими темпами просто загружу уже всю информацию так и не найдя ошибку)))
Так чего там где надо было раскомментировать-то? А может ли быть что в Токио оно встроено?

А что по тем глупейшим вопросам из предпоследнего абзаца?
...
Рейтинг: 0 / 0
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
    #39621325
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СалямиНо в Диспетчере у приложения пишет всего 150-200 метров памяти занято.

Оперативная память <> адресное пространство. Быстро подтвердить это может VMMap .

http://www.gunsmoker.ru/2011/04/windows-spin-off.html

Используйте отладочный менеджер памяти с возможностью поиска утечек (к примеру, FastMM в полном отладочном режиме).

http://www.gunsmoker.ru/2009/05/blog-post_24.html
http://www.transl-gunsmoker.ru/2010/06/blog-post.html

А так - ошибка в 42 строке. Без кода и логов телепатов тут нет.
...
Рейтинг: 0 / 0
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
    #39621368
Салями
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо, будем читать и пробовать...

GunSmokerошибка в 42 строке
гм...
Код: pascal
1.
[42]      Procedure Execute(); override;

гм! Холмс! Это поразительно! Ведь если никогда не вызывать этот метод - то и ошибки абсолютно точно никогда не будет! Но как вы...
...
Рейтинг: 0 / 0
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
    #39622391
Салями
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вылетает всегда с одинаковым:
Debugger Exception Notification---------------------------
Project GrabData_CIKRF_Project.exe raised exception class EOutOfMemory with message 'Out of memory'.
---------------------------Когда вылетает, смотрю в отладчик, и обычно там примерно такое:
Отладчик:74a9dc18 KERNELBASE.RaiseException + 0x48
:0040abb5 @UStrSetLength + $2D
:0040abb5 @UStrSetLength + $2D
UnitWorker.TWorkThread.ProcessData(...)
...
Но один раз было такое:
Отладчик:74a9dc18 KERNELBASE.RaiseException + 0x48
:0040c125 DynArraySetLength + $171
:0040c125 DynArraySetLength + $171
:0040c266 @DynArraySetLength + $A
IdIOHandler.TIdIOHandler.ReadBytes((0, 0, 0, 0, 0, 0, 0, 0, 0, ... // очень много нулей...
IdIOHandler.TIdIOHandler.ReadStream($2F1B140,1552,False)
IdHTTP.ReadChunked
IdHTTP.TIdCustomHTTP.ReadResult($2E86C30,$2F0BC80)
IdHTTP.TIdHTTPProtocol.ProcessResponse((...))
IdHTTP.TIdCustomHTTP.DoRequest(???,'...',nil,$2F1B140,(...))
IdHTTP.TIdCustomHTTP.Get('...',$2F1B140,(...))
IdHTTP.TIdCustomHTTP.Get('...',(...))
IdHTTP.TIdCustomHTTP.Get('...')
UnitWorker.TWorkThread.ProcessDataGet(...)
...
И вот подключил я FastMM, перекомпилировал, запустил продолжать работу - на этот раз ждать вылета пришлось намного дольше, не уверен из-за FastMM ли это или из-за того что попались другие данные...

И когда программа опять вылетела, проверил что в отладчике всё то же самое, как обычно нажал "Продолжить", программа выдала уже свой MessageBox с сообщением об ошибке, закрываю форму "крестиком", ожидаю окна FastMM - но его нету.
Сперва растерялся даже, но потом гляжу - форма-то пропала, но процесс программы висит, IDE предлагает только "Pause" и "Reset". Ждал, ждал... В "Диспетчере задач" используемая память то уменьшалась, то увеличивалась, процессор на процетов 6-7 кушает.
Мне как бы чего, дальше ждать или как?
...
Рейтинг: 0 / 0
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
    #39622394
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СалямиЖдал, ждал... В "Диспетчере задач" используемая память то уменьшалась, то увеличивалась, процессор на процетов 6-7 кушает.Похоже на 17-ю строку.
...
Рейтинг: 0 / 0
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
    #39622395
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockСалямиЖдал, ждал... В "Диспетчере задач" используемая память то уменьшалась, то увеличивалась, процессор на процетов 6-7 кушает.Похоже на 17-ю строку.О, сорри, не заметил, раньше уже 42-ю отгадали же.
...
Рейтинг: 0 / 0
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
    #39622397
Салями
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вы не поняли суть последнего сообщения. Подключил FastMM, закрываю программу - а окна FastMM нету и процесс висит в непонятном состоянии!
Без FastMM подобного не бывало. Что произошло? Это нормально? Мне дальше ждать пока оно "додумает" или "произошло нечто страшное" и просто прибить процесс?
...
Рейтинг: 0 / 0
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
    #39622398
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты просто не понимаешь, для чего нужен FastMM4.
Это всего лишь диспетчер памяти, который может при завершении приложения показывает неосвобожденную перед завершением приложения память.

Если приложением "вылетает" - FastMM4 тебе не поможет.

Попробуй запустить приложение и завершить его "нормально", до вылета. Возможно, FastMM4 покажет проблему с неосвобожденной памятью.
Если приложение корректно освобождает занятую память - FastMM4 тебе ничего не покажет и, соответственно, не поможет. Даже если приложение хапает памяти больше, чем может съесть и в итоге вылетает с Out Of Memory.
...
Рейтинг: 0 / 0
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
    #39622399
Салями
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я понимаю. Просто ждал окно с информацией об неосвобожденной памяти (сделал чтоб она абсолютно точно была), а получил процесс в "коме".
До вылета будет сложно. Алгоритм на данной стадии разработки не рассчитан на прерывание процесса. Хотя... Попробую запустить на получение только одной ветки "дерева"...
чччДЕсли приложением "вылетает" - FastMM4 тебе не поможет.э... Вроде ж и при вылетах показывает. Во всяком случае на пустом проекте для проверки FastMM4 показывало. Оно же не в совсем трубу вылетает, а в "Try Except".

Ладно, оставлю процесс на ночь "думать". Утром посмотрим...
...
Рейтинг: 0 / 0
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
    #39622444
kep-ko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Салями, хотя всё что брал вроде освобождаю
Код: pascal
1.
2.
Project.dpr
ReportMemoryLeaksOnShutdown := True;


или добавь планок памяти, собери x64 и спи спокойно )
...
Рейтинг: 0 / 0
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
    #39622456
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так же телепатически, навскидку
если вы делаете это в потоке, то нужно не забывать, что все функции форматирования IntToStr, FloatToStr, Format и т.д. требуют обязательно третий параметр formatSettings.
Правда в этом случае не OutOfMemory а Access Violation
...
Рейтинг: 0 / 0
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
    #39622461
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krapotkinтак же телепатически, навскидку
если вы делаете это в потоке, то нужно не забывать, что все функции форматирования IntToStr, FloatToStr, Format и т.д. требуют обязательно третий параметр formatSettings.
Правда в этом случае не OutOfMemory а Access ViolationОго, это с какой версии так стало??
...
Рейтинг: 0 / 0
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
    #39622474
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сколько себя помню
http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/SysUtils_Format@string@array_of_const.html]вот например

авторTwo syntax forms are given for Format. The first form of Format is not thread-safe, because it uses localization information contained in global variables. The second form of Format, which is thread-safe, refers to localization information contained in the FormatSettings parameter. Before calling the thread-safe form of Format, you must populate FormatSettings with localization information. To populate FormatSettings with a set of default locale values, call GetLocaleFormatSettings.
...
Рейтинг: 0 / 0
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
    #39622494
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krapotkinесли вы делаете это в потоке, то нужно не забывать, что все функции форматирования IntToStr, FloatToStr, Format и т.д. требуют обязательно третий параметр formatSettings.
то-то я смотрю, просто format в потоке не работает
...
Рейтинг: 0 / 0
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
    #39622553
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krapotkinсколько себя помню
http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/SysUtils_Format@string@array_of_const.html]вот например

авторTwo syntax forms are given for Format. The first form of Format is not thread-safe, because it uses localization information contained in global variables. The second form of Format, which is thread-safe, refers to localization information contained in the FormatSettings parameter. Before calling the thread-safe form of Format, you must populate FormatSettings with localization information. To populate FormatSettings with a set of default locale values, call GetLocaleFormatSettings.
Отстал я от жизни.
До D6 (в D7 по моему тоже) включительно такого не было (как и типа TFormatSettings). Все глобальные переменные в SysUtils вычитываются в initialization 1 раз и потом не меняются, работают только на чтение, во всех потоках.
Видимо, с какой-то версии они начали меняться в процессе работы программы.
Не знал. Добавился еще один минус в идею обновиться :)
...
Рейтинг: 0 / 0
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
    #39622569
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

Ключевое слово "переменные", т.е. приложение может их изменить при необходимости.
...
Рейтинг: 0 / 0
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
    #39622606
Фотография kloun02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krapotkinфункции форматирования IntToStr , FloatToStr, Format и т.д. требуют обязательно третий параметр formatSettings.
http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/SysUtils_IntToStr@Int64.html]IntToStr
...
Рейтинг: 0 / 0
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
    #39622627
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
инт конечно я погорячился, но те кто зависит от formatSettings...
...
Рейтинг: 0 / 0
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
    #39622635
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Салямипроцесс программы висит, IDE предлагает только "Pause" и "Reset". Ждал, ждал... В "Диспетчере задач" используемая память то уменьшалась, то увеличивалась, процессор на процетов 6-7 кушает.
Мне как бы чего, дальше ждать или как?

Есть мнение, что FastMM нужно много времени, чтобы собрать информацию о всех 2 Гб выделенной памяти. Можно нажать на Pause, открыть окно Threads, переключиться в главный поток, открыть окно Call Stack и проверить эту гипотезу.

Также можно не дожидаться выброса исключения Out of memory и сдампить память в файл на середине процесса .
...
Рейтинг: 0 / 0
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
    #39622652
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpYuRock,

Ключевое слово "переменные", т.е. приложение может их изменить при необходимости.
Да, могут. Мои приложения даже меняют иногда одну - DecimalSeparator (которая Char). Не думаю, что это может привести к AV.
...
Рейтинг: 0 / 0
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
    #39622666
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СалямиВ "Диспетчере задач" используемая память то уменьшалась, то увеличивалась

Совершенно не понятно, о какой памяти идёт речь.

По умолчанию Диспетчер задач показывает оперативную память, занимаемую программой. Так называемый working set. Это значение ну никак не связано с реально выделенной памятью в твоей программе. Ну вообще никак. Оно показывает лишь интенсивность использования памяти. Программа много обращается к разной памяти? Working set будет большой. Программа обращается к узкому набору блоков? Working set будет маленький. Даже если программа вообще-то дофига выделила памяти.

Нужно включить столбец Private memory (я не знаю, как он называется в стандартном Диспетчере) - это значение и будет показывать, сколько памяти выделила программа.

Вот, возьми на вооружение немножко диагностического говно-кода:

Код: 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.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
var
  LibPSApi: HMODULE;
  LibShlwAPI: HMODULE;
  StrFormatByteSizeW: function(ASize: Int64; szBuf: PWideChar; uiBufSize: UINT): PWideChar; stdcall;

procedure GetMemInfoApplication(out AAllocated, ARAM, APeakRAM, APrivate, APeakPrivate, AVirtual: UInt64);
type
  PtrUInt = {$IFDEF CPU64}UInt64{$ELSE}Cardinal{$ENDIF};

  TMemCounters = packed record
    cb: DWORD;
    PageFaultCount: DWORD;
    PeakWorkingSetSize: PtrUInt;
    WorkingSetSize: PtrUInt;
    QuotaPeakPagedPoolUsage: PtrUInt;
    QuotaPagedPoolUsage: PtrUInt;
    QuotaPeakNonPagedPoolUsage: PtrUInt;
    QuotaNonPagedPoolUsage: PtrUInt;
    PagefileUsage: PtrUInt;
    PeakPagefileUsage: PtrUInt;
  end;

  TMemoryStatusEx = packed record
    dwLength: DWord;
    dwMemoryLoad: DWord;
    ullTotalPhys: UInt64;
    ullAvailPhys: UInt64;
    ullTotalPageFile: UInt64;
    ullAvailPageFile: UInt64;
    ullTotalVirtual: UInt64;
    ullAvailVirtual: UInt64;
    ullAvailExtendedVirtual: UInt64;
  end;

var
  GetProcessMemoryInfo: function(Handle: THandle; var Counters: TMemCounters; cb: DWORD): BOOL; stdcall;
  GlobalMemoryStatusEx: function(var lpBuffer: TMemoryStatusEx): BOOL; stdcall;
  Stats: TMemCounters;
  MemEx: TMemoryStatusEx;
  Mem: TMemoryStatus;
begin
  ARAM := 0;
  APeakRAM := 0;
  APrivate := 0;
  APeakPrivate := 0;
  AVirtual := 0;

  {$WARNINGS OFF}
  AAllocated := AllocMemSize;
  {$WARNINGS ON}

  if LibPSApi = 0 then
  begin
    LibPSApi := LoadLibrary('PSApi.dll');
    if LibPSApi = 0 then
      LibPSApi := 1;
  end;
  if LibPSApi <> 1 then
  begin
    GetProcessMemoryInfo := GetProcAddress(LibPSApi, 'GetProcessMemoryInfo');
    if Assigned(GetProcessMemoryInfo) then
    begin
      FillChar(Stats, SizeOf(Stats), 0);
      Stats.cb := SizeOf(Stats);
      if GetProcessMemoryInfo(GetCurrentProcess, Stats, SizeOf(Stats)) then
      begin
        ARAM := Stats.WorkingSetSize;
        APeakRAM := Stats.PeakWorkingSetSize;
        APrivate := Stats.PagefileUsage;
        APeakPrivate := Stats.PeakPagefileUsage;
      end;
    end;
  end;

  GlobalMemoryStatusEx := GetProcAddress(GetModuleHandle('kernel32.dll'), 'GlobalMemoryStatusEx');
  if Assigned(GlobalMemoryStatusEx) then
  begin
    FillChar(MemEx, SizeOf(MemEx), 0);
    MemEx.dwLength := SizeOf(MemEx);
    if GlobalMemoryStatusEx(MemEx) then
    begin
      AVirtual := MemEx.ullTotalVirtual - MemEx.ullAvailVirtual;
      Exit;
    end;
  end;

  FillChar(Mem, SizeOf(Mem), 0);
  Mem.dwLength := SizeOf(Mem);
  GlobalMemoryStatus(Mem);
  AVirtual := Mem.dwTotalVirtual - Mem.dwAvailVirtual;
end;

function FmtSizeToStr(const ASize: Int64): String;
const
  _Kb: Int64 = 1024;
  _Mb: Int64 = 1024*1024;
  _Gb: Int64 = 1024*1024*1024;
  _Tb: Int64 = 1099511627776; // 1024*1024*1024*1024;
begin
  if ASize < _Kb then
    Result := Format('%s %s', [UIntToStr(UInt64(ASize)), 'b'])
  else
  if ASize < _Mb then
    Result := Format('%s %s', [FloatToStrF(ASize / _Kb, ffFixed, 18, 2), 'Kb'])
  else
  if ASize < _Gb then
    Result := Format('%s %s', [FloatToStrF(ASize / _Mb, ffFixed, 18, 2), 'Mb'])
  else
  if ASize < _Tb then
    Result := Format('%s %s', [FloatToStrF(ASize / _Gb, ffFixed, 18, 2), 'Gb'])
  else
    Result := Format('%s %s', [FloatToStrF(ASize / _Tb, ffFixed, 18, 2), 'Tb']);
end;

function StrFormatByteSizeDummy(ASize: Int64; szBuf: PWideChar; uiBufSize: UINT): PWideChar; stdcall;
var
  Buf: WideString;
  Sz: Integer;
begin
  Buf := FmtSizeToStr(ASize);

  if Cardinal(Length(Buf)) + 1 < uiBufSize then
    Sz := Length(Buf) + 1
  else
    Sz := uiBufSize;
  if Sz > 0 then
  begin
    Move(Buf[1], szBuf^, Sz * SizeOf(WideChar));
    szBuf[uiBufSize - 1] := #0;
  end;
  Result := szBuf;
end;

function FmtFormatSize(const ASize: Int64): String;
var
  Buf: WideString;
begin
  if LibShlwAPI = 0 then
  begin
    LibShlwAPI := LoadLibrary('shlwapi.dll');
    if LibShlwAPI = 0 then
      LibShlwAPI := 1;
  end;
  if not Assigned(StrFormatByteSizeW) then
  begin
    if LibShlwAPI = 1 then
      StrFormatByteSizeW := StrFormatByteSizeDummy
    else
    begin
      StrFormatByteSizeW := GetProcAddress(LibShlwAPI, 'StrFormatByteSizeW'); // Do Not Localize
      if not Assigned(StrFormatByteSizeW) then
        StrFormatByteSizeW := StrFormatByteSizeDummy;
    end;
  end;
  SetLength(Buf, 1024);
  if StrFormatByteSizeW(ASize, PWideChar(Buf), Length(Buf)) = nil then
    StrFormatByteSizeDummy(ASize, PWideChar(Buf), Length(Buf));
  Result := PWideChar(Buf);
end;

function FmtSize(const ASize: Int64): String;
var
  Sz: UInt64;
begin
  if ASize = 0 then
    Result := '0'
  else
  begin
    Sz := UInt64(ASize);
    Result := UIntToStr(Sz) + ' (' + FmtSizeToStr(ASize) +')';
  end;
end;

procedure TForm106.Timer1Timer(Sender: TObject);
var
  Allocated: UInt64;
  RAM: UInt64;
  PeakRAM: UInt64;
  PrivateMem: UInt64;
  PeakPrivate: UInt64;
  VirtualMem: UInt64;
begin
  GetMemInfoApplication(Allocated, RAM, PeakRAM, PrivateMem, PeakPrivate, VirtualMem);
  Label1.Caption := Format('Allocated: %s' + sLineBreak +
                           'RAM: %s; peak: %s' + sLineBreak +
                           'Private: %s; peak: %s' + sLineBreak +
                           'Virtual: %s',
    [FmtSize(Allocated), FmtSize(RAM), FmtSize(PeakRAM), FmtSize(PrivateMem), FmtSize(PeakPrivate), FmtSize(VirtualMem)]);
end;



Размести вывод куда-нибудь в доступное место и копируй значения сюда, на форум.

P.S. Значение Allocated будет работать только в старых версиях Delphi.
...
Рейтинг: 0 / 0
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
    #39622672
Belotsky Serge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделать несколько итераций (да хотя бы одну) и нормально завершить приложение. Менеджер должен показать наличие утечек. Не знаю, что там сейчас в Токио, а в XE3 нормально AQtime работает (Allocation profile, ReferenceCounter). Если все нормально освобождается, отчет менеджера должен быть пустым.
...
Рейтинг: 0 / 0
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
    #39622680
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СалямиМне дальше ждать пока оно "додумает" Ждать. Пока не соберет всю информацию. Если утечек много, то процесс не быстрый.

А еще лучше просто запустить программу минут на 5, завершить и посмотреть на список утечек
kep-koили добавь планок памятиЧто за бред?
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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