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

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

13.06.2019, 13:48. Показов 5724. Ответов 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
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
19.06.2019, 08:17
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Aleklon Посмотреть сообщение
ну я пишу в основном парсеры. На некоторых сайтах ставятся скриптовые куки, а бюджет не позволяет тратить несколько дней на разбор скриптов, поэтому там twebbrowser, а точнее емембед подходит, иначе вообще никак не получится.
Так там человек кнопочку жмет или что происходит?
0
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 57
19.06.2019, 08:20  [ТС]
Цитата Сообщение от Nanotentacle Посмотреть сообщение
Так там человек кнопочку жмет или что происходит?
Не, сама программа все жмет и вставляет. Если хотите, я могу в личку скинуть профиль на фл и там будет понятно что я пишу))
0
 Аватар для krapotkin
6851 / 4677 / 1465
Регистрация: 14.04.2014
Сообщений: 20,674
Записей в блоге: 21
19.06.2019, 08:41
ну же емое
зачем программа куда-то жмет?
просто вызывать нужную процедуру она не в силах???
0
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
19.06.2019, 08:42
Цитата Сообщение от Aleklon Посмотреть сообщение
Не, сама программа все жмет и вставляет. Если хотите, я могу в личку скинуть профиль на фл и там будет понятно что я пишу))
Да нет, мне в личку никто писать не может по объективным причинам. Просто мне кажется, что использование TWebBrowser все же не оптимально, но если работает и не вызывает проблем, то это ладно... А с утечками у TWebBrowser можно попробовать решать путем пересоздания компонента после очередной итерации цикла, или определить какие-то отправные точки, после которых его пересоздавать. Имхо, убивать приложение и запускать новое ради выгрузки - это костыль, который можно обойти.
0
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 57
19.06.2019, 08:57  [ТС]
Цитата Сообщение от krapotkin Посмотреть сообщение
ну же емое
зачем программа куда-то жмет?
просто вызывать нужную процедуру она не в силах???
В смысле зачем? Заказчику надо собрать, например, текущие ставки на спортивные мероприятия. Сайт использует динамические куки для этого, без них не отдает данные. Или надо залогиниться. Прога открывает сайт в емембед (это кто не знает, немножко улучшенная версия twebbrowser), вставляет логин-пароль и логинится, дальше снимает содержимое страниц

Добавлено через 47 секунд
Цитата Сообщение от Nanotentacle Посмотреть сообщение
Да нет, мне в личку никто писать не может по объективным причинам. Просто мне кажется, что использование TWebBrowser все же не оптимально, но если работает и не вызывает проблем, то это ладно... А с утечками у TWebBrowser можно попробовать решать путем пересоздания компонента после очередной итерации цикла, или определить какие-то отправные точки, после которых его пересоздавать. Имхо, убивать приложение и запускать новое ради выгрузки - это костыль, который можно обойти.
ну так они 15 лет не могут утечку убрать. Я все схемы перепробовал, осталась одна с правкой самого компонента. Иначе ты просто после десятка обновлений страницы сожрешь всю память. Пересоздание компонента не работает (мне кажется кто-то думает что я просто так глупую тему создал), память не освобождается, я это пробовал

Добавлено через 2 минуты
Да и если возвращаться к теме топика, то :=nil просто присваивает указателю ноль, а не память освобождает, если компилятор, конечно, не заточен
0
 Аватар для krapotkin
6851 / 4677 / 1465
Регистрация: 14.04.2014
Сообщений: 20,674
Записей в блоге: 21
19.06.2019, 08:58
ах, вон что, я думал, это тот случай, когда программа сама в себе кнопки нажимает
тут на форуме этого добра полно
Delphi
1
2
3
4
procedure Button2Click(Sender);
begin
  Button1.Click();
end;
0
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 57
19.06.2019, 09:10  [ТС]
Цитата Сообщение от krapotkin Посмотреть сообщение
ах, вон что, я думал, это тот случай, когда программа сама в себе кнопки нажимает
тут на форуме этого добра полно
Delphi
1
2
3
4
procedure Button2Click(Sender);
begin
  Button1.Click();
end;
Ну справедливости для, что тут не так? Я бы еще в try-except обернул вызов, а так в принципе стандартная ситуация, когда влом отдельно функцию выносить
0
 Аватар для krapotkin
6851 / 4677 / 1465
Регистрация: 14.04.2014
Сообщений: 20,674
Записей в блоге: 21
19.06.2019, 09:28
тут не так главный принцип - интерфейс должен отделяться от реализации
я привел совсем рафинированный пример, обычно где-то это на ComboBox1Change() вызывается в конце к-нить Button1.Click()
а если потом button1 исчезнет с формы, да и форма ...
лень расписывать, потому что если влом - то и разговора нет - пишите как хотите
но я таких антипримеров повидал ух..
особенно при командной разработке и длительной жизни продукта вас просто проклянут...
0
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 57
19.06.2019, 09:36  [ТС]
Цитата Сообщение от krapotkin Посмотреть сообщение
тут не так главный принцип - интерфейс должен отделяться от реализации
я привел совсем рафинированный пример, обычно где-то это на ComboBox1Change() вызывается в конце к-нить Button1.Click()
а если потом button1 исчезнет с формы, да и форма ...
лень расписывать, потому что если влом - то и разговора нет - пишите как хотите
но я таких антипримеров повидал ух..
особенно при командной разработке и длительной жизни продукта вас просто проклянут...
Ну у меня, например, часто идет задача дополнить программу, я тогда ставлю кнопку, где устанавливаю параметры и жму основную, это самый простой и быстрый способ реализации. Но я понял что ты хотел сказать)

Добавлено через 2 минуты
"особенно при командной разработке и длительной жизни продукта вас просто проклянут"
еще ни разу не видел командных разработок на дельфи (ну кроме прога-скрипт, это не в счет))
0
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
19.06.2019, 09:40
Цитата Сообщение от Aleklon Посмотреть сообщение
Пересоздание компонента не работает (мне кажется кто-то думает что я просто так глупую тему создал), память не освобождается, я это пробовал
ReportMemoryLeaksOnShutdown и посмотреть, что в памяти повисает. Если копать компонент, то без этой информации даже начинать не стоит.

Цитата Сообщение от Aleklon Посмотреть сообщение
Да и если возвращаться к теме топика, то :=nil просто присваивает указателю ноль, а не память освобождает, если компилятор, конечно, не заточен
Для объектов это противопоказано. Только Free, и потом уже := nil, либо просто FreeAndNil.
0
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 57
19.06.2019, 09:54  [ТС]
"ReportMemoryLeaksOnShutdown" - можешь немного подробнее рассказать что это за штука, где взять и как использовать?

"Для объектов это противопоказано. Только Free, и потом уже := nil, либо просто FreeAndNil."
у массивов этого нет, а у объектов то понятное дело. Тема про вложенные динамические массивы
0
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
19.06.2019, 10:00
Цитата Сообщение от Aleklon Посмотреть сообщение
"ReportMemoryLeaksOnShutdown" - можешь немного подробнее рассказать что это за штука, где взять и как использовать?
Интернет подскажет быстрее (если речь про полное понимание), если вкратце, то в основном модуле программы пишем
Delphi
1
2
initialization
ReportMemoryLeaksOnShutdown := true;
и наслаждаемся простыней с указанием классов и размеров утекшей памяти после корректного завершения приложения. Для современных Delphi это решение из коробки, для седьмой потребует допиливания в виде установки FastMM.

Цитата Сообщение от Aleklon Посмотреть сообщение
"Для объектов это противопоказано. Только Free, и потом уже := nil, либо просто FreeAndNil."
у массивов этого нет, а у объектов то понятное дело. Тема про вложенные динамические массивы
так для массива присвоение nil вполне себе может отрабатывать корректно. Не проверял, конечно, потому что мне setlength ближе, но уверенно заявлять, что такая операция приведет к утечке памяти не могу.
0
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 57
19.06.2019, 10:08  [ТС]
Цитата Сообщение от Nanotentacle Посмотреть сообщение
Интернет подскажет быстрее (если речь про полное понимание), если вкратце, то в основном модуле программы пишем
Delphi
1
2
initialization
ReportMemoryLeaksOnShutdown := true;
и наслаждаемся простыней с указанием классов и размеров утекшей памяти после корректного завершения приложения. Для современных Delphi это решение из коробки, для седьмой потребует допиливания в виде установки FastMM.


так для массива присвоение nil вполне себе может отрабатывать корректно. Не проверял, конечно, потому что мне setlength ближе, но уверенно заявлять, что такая операция приведет к утечке памяти не могу.
я не могу поверить что компилятор, если указателю nil присвоить, освобождает память. Это же бред какой-то. Мало ли что с ним ты хочешь сделать, по setlength кстати тоже читал, что данные остаются и можно к ним и дальше обращаться (но тут логично, что не нулями заполняется, но с указателем то совсем бред, куда хочешь, туда его и направляй)
0
 Аватар для GoodWeather
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
19.06.2019, 10:22
Цитата Сообщение от Aleklon Посмотреть сообщение
обходить скриптовые защиты?
Что сие обозначать?
Может, "строить модель DOM и выполнять с/на ней все JavaScript"? Тогда да, TWebBrowser проще.
В теории можно найти конкретно движок XML/DOM & JavaScript, не визуальный, но мне такого не попадалось и близко...
Цитата Сообщение от Aleklon Посмотреть сообщение
он жрет память и доходит до идиотизма
У меня как-то ни разу не жрал много. Может у вас какой-то неудачный подход?
Цитата Сообщение от Aleklon Посмотреть сообщение
"ReportMemoryLeaksOnShutdown" - можешь немного подробнее рассказать что это за штука, где взять и как использовать?
Я ж писал, лучше подключите FastMM4, настройте информирование. Статья: Блог GunSmoker-а: Ищем утечки памяти - не ругается на утечки - значит всё ОК.

А освобождение может зависеть и от версии Делфи и от самих данных/структур.
Для 100% гарантии - всё вручную (заодно сами решаете надо ли обнулять).
По факту - просто проверять через FastMM4.
1
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 57
19.06.2019, 10:39  [ТС]
"У меня как-то ни разу не жрал много. Может у вас какой-то неудачный подход?"

ну забей в яндекс twebbrowser память или memory а потом расскажи как провел лето) это старинная проблема, которая почему-то не решена, память очень быстро забивается, если ты не один раз обращаешься к сайту, а тыщу к примеру

"Я ж писал, лучше подключите FastMM4, настройте информирование."
- прочитаю, спасибо

"В теории можно найти конкретно движок XML/DOM & JavaScript, не визуальный, но мне такого не попадалось и близко..."

его и нет, я искал. есть ie и хром, больше ничего вообще нет (ну разве что можно попробовать какой-нибудь питон использовать и прогой к скрипту обращаться)
0
19.06.2019, 10:57

Не по теме:

Цитата Сообщение от Aleklon Посмотреть сообщение
"У меня как-то ни разу не жрал много. Может у вас какой-то неудачный подход?"
есть такая фича полезная на форуме. когда выделяешь чужой текст, то всплывает сразу контекстное меню "цитировать". Таким образом, кого процитировали, тот получает уведомление

Миниатюры
Освобождение памяти вложенных массивов  
0
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 57
19.06.2019, 10:58  [ТС]
Цитата Сообщение от AHBAR Посмотреть сообщение

Не по теме:


есть такая фича полезная на форуме. когда выделяешь чужой текст, то всплывает сразу контекстное меню "цитировать". Таким образом, кого процитировали, тот получает уведомление

спасибо
0
 Аватар для Flip
335 / 173 / 67
Регистрация: 25.02.2018
Сообщений: 616
19.06.2019, 21:57
Цитата Сообщение от Aleklon Посмотреть сообщение
еще ни разу не видел командных разработок на дельфи (ну кроме прога-скрипт, это не в счет))
Ну посмотрите..... и это далеко ещё не полный список.
0
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 57
19.06.2019, 23:26  [ТС]
Цитата Сообщение от Ашотик2018 Посмотреть сообщение
Ну посмотрите..... и это далеко ещё не полный список.
Слушай, ну это ж единичные мировые известные программы (причем не факт что так есть, например, кроме старой утки про скайп, никакого подтверждения нет и лично я сомневаюсь, ну и там еще с++ указан как бы), на дельфях пишут десятки миллионов, а командных работ вы три десятка показали. Я лично не сталкивался с работой где бы несколько людей участвовало (ну кроме скриптовиков и дизайнеров)
0
 Аватар для krapotkin
6851 / 4677 / 1465
Регистрация: 14.04.2014
Сообщений: 20,674
Записей в блоге: 21
19.06.2019, 23:43
не подскажете, почему делфи столь распространена в россии? миллионы одиночек?? )))

делфи заняла нишу АРМов, которые раньше писали на Foxpro и Clipper
почти на каждом предприятии были программы и системы на делфи
и они никогда не шли и не предполагались на массовый рынок
и сейчас RAD studio чистый Enterprise игрок
я работаю в команде и пишу на делфи ПО в огромной компании, но вы тоже его никогда не увидите в этих списках)))

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

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru