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

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

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

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

Сообщение Red » 09.07.2014 13:45:16

Здравствуйте.
Код: Выделить всё
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. Подскажите пожалуйста то чего я не знаю и как быть.
Red
незнакомец
 
Сообщения: 8
Зарегистрирован: 09.07.2014 13:37:07

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

Сообщение vada » 09.07.2014 14:58:19

Не происходит. Потому что SetLength память не освобождает а захватывает.
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

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

Сообщение Red » 09.07.2014 16:07:32

vada
Подскажите пожалуйста как грамотно освободить выделенную память под 1000 элементов массива, чтобы можно было и дальше пользоваться переменной а
Red
незнакомец
 
Сообщения: 8
Зарегистрирован: 09.07.2014 13:37:07

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

Сообщение zub » 09.07.2014 19:55:04

с чего вы взяли что не освобождается?
Код: Выделить всё
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) лишний - динмассивы должны финализироваться при выходе за пределы видимости. ошибаюсь?
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Red » 09.07.2014 20:52:30

В том то и дело, более того если программу оформить как процедуру, то даже после выхода из области видимости(так как в процедуре локальный массив) память не освобождается.
То что не освобождается видно в диспетчере задач виндовс.
Red
незнакомец
 
Сообщения: 8
Зарегистрирован: 09.07.2014 13:37:07

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

Сообщение zub » 09.07.2014 21:09:02

В диспетчере задач не увидеть освобождение памяти, если не ворочить гигабайтами
Приведенный выше код грантированно освобождает массив и один рефкаунт стрингов лежащих в записях. Вполне возможно что в реальной программе вы гдето теряете рефкаунт стрингов в другом месте и они не освобождаются при финализации массива
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Tango » 25.07.2014 17:57:23

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

Для х32
((4*3)+4)*1000=16000 байт.
Аватара пользователя
Tango
постоялец
 
Сообщения: 162
Зарегистрирован: 31.05.2012 17:07:30

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

Сообщение qivi » 28.07.2014 16:00:13

Не стал вникать в суть вашей программы, но я очень широко использую механизм динамических массивов с рекордами, всё освобождается. Подключите модуль проверки утечек, нсли их нет то всё освободилось, а то что вы видите в диспетчере задач, дак это вопросы к менеджеру памяти ОС, он, насколько мне известно, в угоду быстродействия не спешит без существенной на то надобности что то там освобождать.
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 230

Рейтинг@Mail.ru
cron