array of record со строками

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Red
незнакомец
Сообщения: 8
Зарегистрирован: 09.07.2014 13:37:07

array of record со строками

Сообщение Red »

Здравствуйте.

Код: Выделить всё

program Test1;
{$mode objfpc}{$H+}
uses
  Classes,SysUtils;
  Type TSomeRec=record
                  a,b,c:string//shortstring;
                end;
Var a:array of TSomeRec;
begin
  writeln('Start');Readln;
  SetLength(a,1000); writeln('1000 a');Readln;
  SetLength(a,0); writeln('0 a');Readln;
end. 

В этой программе не происходит освобождение памяти выделенной под динамический массив вне зависимости от типа переменных в записи string или shortstring. Подскажите пожалуйста то чего я не знаю и как быть.
Аватара пользователя
vada
энтузиаст
Сообщения: 691
Зарегистрирован: 14.02.2006 12:43:17

Сообщение vada »

Не происходит. Потому что SetLength память не освобождает а захватывает.
Red
незнакомец
Сообщения: 8
Зарегистрирован: 09.07.2014 13:37:07

Сообщение Red »

vada
Подскажите пожалуйста как грамотно освободить выделенную память под 1000 элементов массива, чтобы можно было и дальше пользоваться переменной а
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

с чего вы взяли что не освобождается?

Код: Выделить всё

zamtmn@desktop:~/tmp$ ./project1
Start

1000 a

0 a

Heap dump by heaptrc unit
22 memory blocks allocated : 25202/25208
22 memory blocks freed     : 25202/25208
0 unfreed memory blocks : 0
True heap size : 360448
True free heap : 360448


Добавлено спустя 4 минуты 9 секунд:
Насколько я понимаю тут даже SetLength(a,0) лишний - динмассивы должны финализироваться при выходе за пределы видимости. ошибаюсь?
Red
незнакомец
Сообщения: 8
Зарегистрирован: 09.07.2014 13:37:07

Сообщение Red »

В том то и дело, более того если программу оформить как процедуру, то даже после выхода из области видимости(так как в процедуре локальный массив) память не освобождается.
То что не освобождается видно в диспетчере задач виндовс.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

В диспетчере задач не увидеть освобождение памяти, если не ворочить гигабайтами
Приведенный выше код грантированно освобождает массив и один рефкаунт стрингов лежащих в записях. Вполне возможно что в реальной программе вы гдето теряете рефкаунт стрингов в другом месте и они не освобождаются при финализации массива
Аватара пользователя
Tango
постоялец
Сообщения: 162
Зарегистрирован: 31.05.2012 17:07:30

Сообщение Tango »

Увеличите длину массива до 10000000, тогда и смотрите высвобождение, памяти то берётся копейки.

Для х32
((4*3)+4)*1000=16000 байт.
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

Не стал вникать в суть вашей программы, но я очень широко использую механизм динамических массивов с рекордами, всё освобождается. Подключите модуль проверки утечек, нсли их нет то всё освободилось, а то что вы видите в диспетчере задач, дак это вопросы к менеджеру памяти ОС, он, насколько мне известно, в угоду быстродействия не спешит без существенной на то надобности что то там освобождать.
Ответить