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

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

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

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

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

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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.06.2019, 13:48
Ответы с готовыми решениями:

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

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

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

43
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,168
13.06.2019, 14:00
Все динамические массивы уничтожаются сами по окончании программы. Если массив очень большой и Вам это надо, можете написать a:=nil;
1
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 57
13.06.2019, 14:07  [ТС]
Цитата Сообщение от Puporev Посмотреть сообщение
Все динамические массивы уничтожаются сами по окончании программы. Если массив очень большой и Вам это надо, можете написать a:=nil;
Спасибо. Это убьет встроенные массивы тоже? И какая разница с SetLength(a, 0)?
0
 Аватар для GoodWeather
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
13.06.2019, 14:23
Можно прочитать статью: Блог GunSmoker-а: Ищем утечки памяти - и проверить самому.
Подключите FastMM, настройте информирование, проверьте оба варианта освобождения.
0
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 57
13.06.2019, 14:28  [ТС]
Цитата Сообщение от GoodWeather Посмотреть сообщение
Можно прочитать статью: Блог GunSmoker-а: Ищем утечки памяти - и проверить самому.
Подключите FastMM, настройте информирование, проверьте оба варианта освобождения.
Ну вдруг уже кто-то знает наверняка
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
13.06.2019, 14:31
хороший тон - ВСЕГДА освобождать то что ты сам выделял
несмотря на то, что по умолчанию компилятор добавит скрытый код
зато это сильно поможет впоследствии в разборе старого кода другим людям или даже самому себе
1
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 57
13.06.2019, 14:35  [ТС]
Цитата Сообщение от krapotkin Посмотреть сообщение
хороший тон - ВСЕГДА освобождать то что ты сам выделял
несмотря на то, что по умолчанию компилятор добавит скрытый код
зато это сильно поможет впоследствии в разборе старого кода другим людям или даже самому себе
Ну да, я поэтому и спросил. Но цель вопроса - понять нужно ли вложенные массивы удалять по отдельности или достаточно верхний обнулить
0
 Аватар для GoodWeather
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
13.06.2019, 16:25
Цитата Сообщение от Aleklon Посмотреть сообщение
вдруг уже кто-то знает наверняка
Конечно знает. Справка по вашей версии компилятора знает как оно обрабатывается в вашей версии компилятора.
Только вдруг у вас Делфи5 какая-нибудь? Я с пятой не работал, вполне допускаю, что там может оказаться не так как в текущей. Проще и быстрее проверить.
А ещё проще и эффективнее - последовать совету krapotkin'а.
0
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 57
13.06.2019, 16:43  [ТС]
Цитата Сообщение от GoodWeather Посмотреть сообщение
Конечно знает. Справка по вашей версии компилятора знает как оно обрабатывается в вашей версии компилятора.
Только вдруг у вас Делфи5 какая-нибудь? Я с пятой не работал, вполне допускаю, что там может оказаться не так как в текущей. Проще и быстрее проверить.
А ещё проще и эффективнее - последовать совету krapotkin'а.
XE5

А по совету - ну так я и спросил для того чтобы правильно освободить память
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,609
14.06.2019, 02:26
Цитата Сообщение от krapotkin Посмотреть сообщение
хороший тон - ВСЕГДА освобождать то что ты сам выделял
+1
И не надо смотреть на версию! Береженого бог бережет. А все прочие идут лесом на север.
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
18.06.2019, 15:58
Цитата Сообщение от 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
Сообщений: 57
18.06.2019, 17:41  [ТС]
Цитата Сообщение от 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
Сообщений: 57
19.06.2019, 04:16  [ТС]
@Fil а зачем ты переместил тему в дельфи для начинающих, если никто из про не смог ответить полностью на вопрос до сих пор?

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

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

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


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

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

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

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

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

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

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

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

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

И кроме дикой косячности, плюсы даже для начала разработки там есть, например, нормально, в отличие от браузера перехватывается снифферами
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.06.2019, 07:52
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru