Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 56
1

Освобождение памяти вложенных массивов

13.06.2019, 13:48. Показов 3939. Ответов 43
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.

Есть код вида:

Delphi
1
2
3
4
5
6
7
type a1 = record
  str: array of string;
  ........
end;
 
var
  a: array of a1;
Чтобы освободить память мне достаточно ввести SetLength(a, 0) или надо сначала пройтись по массиву и освободить в него вложенные?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.06.2019, 13:48
Ответы с готовыми решениями:

TList и освобождение памяти
Имеет var iItems:TList procedure AddRecord (Value: TStringList); var s:TStringList; begin...

Освобождение памяти при выходе из программы
Просматривая исходные тексты программ, заметил, что часто на событие FormDestroy вешают удаление...

Освобождение памяти после репликации
Всем привет. Версия Delphi XE6, база данных FireBird. В своей программе реализовал механизм...

Освобождение памяти после закрытие данных в Делфи
Мир всем и привет ! как освободит, очищать память приложение после FDQuery.close; ?

43
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
13.06.2019, 14:00 2
Все динамические массивы уничтожаются сами по окончании программы. Если массив очень большой и Вам это надо, можете написать a:=nil;
1
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 56
13.06.2019, 14:07  [ТС] 3
Цитата Сообщение от Puporev Посмотреть сообщение
Все динамические массивы уничтожаются сами по окончании программы. Если массив очень большой и Вам это надо, можете написать a:=nil;
Спасибо. Это убьет встроенные массивы тоже? И какая разница с SetLength(a, 0)?
0
884 / 586 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
13.06.2019, 14:23 4
Можно прочитать статью: Блог GunSmoker-а: Ищем утечки памяти - и проверить самому.
Подключите FastMM, настройте информирование, проверьте оба варианта освобождения.
0
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 56
13.06.2019, 14:28  [ТС] 5
Цитата Сообщение от GoodWeather Посмотреть сообщение
Можно прочитать статью: Блог GunSmoker-а: Ищем утечки памяти - и проверить самому.
Подключите FastMM, настройте информирование, проверьте оба варианта освобождения.
Ну вдруг уже кто-то знает наверняка
0
5784 / 4526 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
13.06.2019, 14:31 6
хороший тон - ВСЕГДА освобождать то что ты сам выделял
несмотря на то, что по умолчанию компилятор добавит скрытый код
зато это сильно поможет впоследствии в разборе старого кода другим людям или даже самому себе
1
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 56
13.06.2019, 14:35  [ТС] 7
Цитата Сообщение от krapotkin Посмотреть сообщение
хороший тон - ВСЕГДА освобождать то что ты сам выделял
несмотря на то, что по умолчанию компилятор добавит скрытый код
зато это сильно поможет впоследствии в разборе старого кода другим людям или даже самому себе
Ну да, я поэтому и спросил. Но цель вопроса - понять нужно ли вложенные массивы удалять по отдельности или достаточно верхний обнулить
0
884 / 586 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
13.06.2019, 16:25 8
Цитата Сообщение от Aleklon Посмотреть сообщение
вдруг уже кто-то знает наверняка
Конечно знает. Справка по вашей версии компилятора знает как оно обрабатывается в вашей версии компилятора.
Только вдруг у вас Делфи5 какая-нибудь? Я с пятой не работал, вполне допускаю, что там может оказаться не так как в текущей. Проще и быстрее проверить.
А ещё проще и эффективнее - последовать совету krapotkin'а.
0
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 56
13.06.2019, 16:43  [ТС] 9
Цитата Сообщение от GoodWeather Посмотреть сообщение
Конечно знает. Справка по вашей версии компилятора знает как оно обрабатывается в вашей версии компилятора.
Только вдруг у вас Делфи5 какая-нибудь? Я с пятой не работал, вполне допускаю, что там может оказаться не так как в текущей. Проще и быстрее проверить.
А ещё проще и эффективнее - последовать совету krapotkin'а.
XE5

А по совету - ну так я и спросил для того чтобы правильно освободить память
0
пофигист широкого профиля
4732 / 3167 / 858
Регистрация: 15.07.2013
Сообщений: 18,251
14.06.2019, 02:26 10
Цитата Сообщение от krapotkin Посмотреть сообщение
хороший тон - ВСЕГДА освобождать то что ты сам выделял
+1
И не надо смотреть на версию! Береженого бог бережет. А все прочие идут лесом на север.
0
Житель Земли
3002 / 3004 / 391
Регистрация: 26.07.2011
Сообщений: 11,463
Записей в блоге: 1
18.06.2019, 15:58 11
Цитата Сообщение от Aleklon Посмотреть сообщение
type a1 = record
* str: array of string;
* ........
end;
как вариант
Delphi
1
2
3
4
5
type
  TMyRec = record
    Str: array of string;
    procedure ClearArray;
  end;
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
implementation
 
{$R *.dfm}
 
{ TMyRec }
 
procedure TMyRec.ClearArray;
begin
  // как-то очищаем массив
end;
 
procedure TForm2.Button1Click(Sender: TObject);
var
  i: integer;
begin
  for i:= Low(a) to High(a) do a[i].ClearArray;
end;
 
end.
1
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 56
18.06.2019, 17:41  [ТС] 12
Цитата Сообщение от DenNik Посмотреть сообщение
как вариант
Delphi
1
2
3
4
5
type
  TMyRec = record
    Str: array of string;
    procedure ClearArray;
  end;
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
implementation
 
{$R *.dfm}
 
{ TMyRec }
 
procedure TMyRec.ClearArray;
begin
  // как-то очищаем массив
end;
 
procedure TForm2.Button1Click(Sender: TObject);
var
  i: integer;
begin
  for i:= Low(a) to High(a) do a[i].ClearArray;
end;
 
end.
а чем это отличается от nil или setlength, зачем это городить?
0
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 56
19.06.2019, 04:16  [ТС] 13
@Fil а зачем ты переместил тему в дельфи для начинающих, если никто из про не смог ответить полностью на вопрос до сих пор?

Добавлено через 2 минуты
я и дальше вброшу - судя по ру и англо-форумам при обнулении динамического массива (рекорда точнее), память не освобождается, а резервируется и используется потом вторично
0
884 / 404 / 174
Регистрация: 20.10.2016
Сообщений: 1,828
19.06.2019, 04:26 14
Цитата Сообщение от Aleklon Посмотреть сообщение
@Fil а зачем ты переместил тему в дельфи для начинающих, если никто из про не смог ответить полностью на вопрос до сих пор?
По моему, тут куча ответов. А вообще, если брать начальную постановку вопроса:
Цитата Сообщение от Aleklon Посмотреть сообщение
Чтобы освободить память мне достаточно ввести SetLength(a, 0) или надо сначала пройтись по массиву и освободить в него вложенные?
то достаточно ввести SetLength(a,0). Насколько я знаю все, что было создано не программистом (а SetLength - это как раз такая ситуация) не программистом же и должно быть удалено. А вот если используется New, то там без Dispose не обойтись. Сколько я имел дел с динамическими массивами и использовал SetLength столько раз я не получал утечек памяти по завершении программы (а я во время отладки всегда использую ReportMemoryLeaksOnShutdown).

Цитата Сообщение от Aleklon Посмотреть сообщение
я и дальше вброшу - судя по ру и англо-форумам при обнулении динамического массива (рекорда точнее), память не освобождается, а резервируется и используется потом вторично
Как это относится к освобождению памяти как таковой? Если это поведение стандартное для Делфи, то, имхо, туда и не стоит лезть, потому что в 99% случаев это будет корректное поведение, а оставшийся 1% случаев - это, обычно, слишком явные косяки, типа попытки закачки гигабайтного массива в память.
0
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 56
19.06.2019, 04:35  [ТС] 15
Цитата Сообщение от Nanotentacle Посмотреть сообщение
По моему, тут куча ответов. А вообще, если брать начальную постановку вопроса:

то достаточно ввести SetLength(a,0). Насколько я знаю все, что было создано не программистом (а SetLength - это как раз такая ситуация) не программистом же и должно быть удалено. А вот если используется New, то там без Dispose не обойтись. Сколько я имел дел с динамическими массивами и использовал SetLength столько раз я не получал утечек памяти по завершении программы (а я во время отладки всегда использую ReportMemoryLeaksOnShutdown).


Как это относится к освобождению памяти как таковой? Если это поведение стандартное для Делфи, то, имхо, туда и не стоит лезть, потому что в 99% случаев это будет корректное поведение, а оставшийся 1% случаев - это, обычно, слишком явные косяки, типа попытки закачки гигабайтного массива в память.
ну во первых, четкого ответа не было, только предположения или философствование
по памяти - у меня прога на серваке работает 24/7 соответственно если правильно не освобождать память, то рано или поздно она повиснет.

По завершению прога сама все освобождает, тут дело касается работе непрерывно год, например
Тут у дельфи есть особенности. Поэтому и спросил. А дальше к twebbrowser перейдем, который за 15 лет в плане утечки памяти так и не починили). Сейчас очень важно знать как для серверной проги очистить память, ответов подтвержденных фактами пока в теме не было, я лично сначала обнуляю вложенные массивы, а потом основной, но это какой то идиотизм
0
884 / 404 / 174
Регистрация: 20.10.2016
Сообщений: 1,828
19.06.2019, 04:41 16
Цитата Сообщение от Aleklon Посмотреть сообщение
по памяти - у меня прога на серваке работает 24/7 соответственно если правильно не освобождать память, то рано или поздно она повиснет.
У меня программа работает с массивами, каждые 15 минут массив чистится и заполняется вновь. Работает уже около 7 лет, ни разу не падала из-за утечек памяти, типичный срок непрерывной работы программы составляет год.

Цитата Сообщение от Aleklon Посмотреть сообщение
По завершению прога сама все освобождает, тут дело касается работе непрерывно год, например
"Резервируется" и "не освобождается" вещи совершенно разные, так как "резервируется" может быть использовано повторно (и выделение памяти тогда происходит быстрее, так как область памяти уже есть в распоряжении программы), а "не освобождается" использоваться не может.

Цитата Сообщение от Aleklon Посмотреть сообщение
А дальше к twebbrowser перейдем, который за 15 лет в плане утечки памяти так и не починили
Кто-то еще использует TWebBrowser? Зачем? Это визуальный компонент, и его надо использовать соответствующе, но я не могу придумать ни одного случая, когда надо использовать именно его.

Цитата Сообщение от Aleklon Посмотреть сообщение
Сейчас очень важно знать как для серверной проги очистить память, ответов подтвержденных фактами пока в теме не было, я лично сначала обнуляю вложенные массивы, а потом основной, но это какой то идиотизм
Ну так поставьте свою программу, пусть покрутится недельку на сервере, да посмотрите, что произойдет. Надо бороться с реальными проблемами, а не фантомными.
0
Модератор
9256 / 6034 / 2379
Регистрация: 21.01.2014
Сообщений: 25,793
Записей в блоге: 3
19.06.2019, 04:42 17
Цитата Сообщение от Aleklon Посмотреть сообщение
Чтобы освободить память мне достаточно ввести SetLength(a, 0)
Если мне склероз не изменяет, еще со времен Паскаля для этого использовалась процедура finalize()
0
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 56
19.06.2019, 04:58  [ТС] 18
"Ну так поставьте свою программу, пусть покрутится недельку на сервере, да посмотрите, что произойдет." я уже отдал заказчику. Но мне самому стало любопытно и поднял эту тему. Я думаю не нужно тебе говорить, что ты не сможешь написать строчку типа var s: array[0..1000000] of string, там память кусками распределяется, а если еще и вложенные массивы, то я вот хрен знает что там. Уважаемый коллега только что еще одну версию кинул, но это версия (и на мой взгляд не рабочая, но я проверю), а не решение

по twebrowser - а что есть другой вариант обходить скриптовые защиты? Хроминиум разве что, но на него нет вообще никакой документации, с прогой надо мегов 60-100 библиотек прикладывать и он вешает комп не меньше чем эта хрень под ie)
Больше браузерных вариантов нет вообще
0
884 / 404 / 174
Регистрация: 20.10.2016
Сообщений: 1,828
19.06.2019, 05:52 19
Цитата Сообщение от D1973 Посмотреть сообщение
Если мне склероз не изменяет, еще со времен Паскаля для этого использовалась процедура finalize()
Если мне мой склероз не изменяет, то это имеет смысл только в контексте существования Initialize. То есть если выделить память через New или Initialize (хотя с initialize не работал), то делфи автоматически память не освобождает даже для локальных переменных в процедурах.

Цитата Сообщение от Aleklon Посмотреть сообщение
по twebrowser - а что есть другой вариант обходить скриптовые защиты
учитывая мой опыт работы с этим компонентом (конечно, не берусь говорить, что я тут 100% прав), но он косячен до нереальности, с постоянными ошибками обработок скриптов и т.д. Но остается вопрос: а зачем обходить скриптовую защиту в вашей программе?

Цитата Сообщение от Aleklon Посмотреть сообщение
я уже отдал заказчику.
Тогда забить. Все будет работать правильно, если используется SetLength(a,0). Возможно, конечно, требовалось сделать setlength для вложенных массивов, это да, но само по себе setlength(a,0) - это корректно для конкретного массива.
0
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 56
19.06.2019, 07:52  [ТС] 20
"учитывая мой опыт работы с этим компонентом (конечно, не берусь говорить, что я тут 100% прав), но он косячен до нереальности, с постоянными ошибками обработок скриптов и т.д. Но остается вопрос: а зачем обходить скриптовую защиту в вашей программе?"

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

И кроме дикой косячности, плюсы даже для начала разработки там есть, например, нормально, в отличие от браузера перехватывается снифферами
0
19.06.2019, 07:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.06.2019, 07:52
Помогаю со студенческими работами здесь

Освобождение памяти
1) Так получилось, что у меня подряд появляются 4 формы. Каждый раз, как показывается следующая...

Освобождение памяти
Вопрос по освобождению памяти. В цикле vList получает новую память и адрес соответственно и...

Pchar и освобождение памяти
Здравствуйте. Написал парсинг страницы сайта. Запрос страницы идёт из основной программы, после...

Освобождение памяти от объектов
Итак. Есть следующий код (элементы) type TStage = class(TObject) level: integer; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru