1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 56
|
||||||
1 | ||||||
Освобождение памяти вложенных массивов13.06.2019, 13:48. Показов 3939. Ответов 43
Метки нет (Все метки)
Добрый день.
Есть код вида:
0
|
13.06.2019, 13:48 | |
Ответы с готовыми решениями:
43
TList и освобождение памяти Освобождение памяти при выходе из программы Освобождение памяти после репликации Освобождение памяти после закрытие данных в Делфи |
Почетный модератор
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 |
0
|
13.06.2019, 14:23 | 4 |
Можно прочитать статью: Блог GunSmoker-а: Ищем утечки памяти - и проверить самому.
Подключите FastMM, настройте информирование, проверьте оба варианта освобождения.
0
|
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 56
|
|
13.06.2019, 14:28 [ТС] | 5 |
0
|
13.06.2019, 14:31 | 6 |
хороший тон - ВСЕГДА освобождать то что ты сам выделял
несмотря на то, что по умолчанию компилятор добавит скрытый код зато это сильно поможет впоследствии в разборе старого кода другим людям или даже самому себе
1
|
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 56
|
|
13.06.2019, 14:35 [ТС] | 7 |
Ну да, я поэтому и спросил. Но цель вопроса - понять нужно ли вложенные массивы удалять по отдельности или достаточно верхний обнулить
0
|
13.06.2019, 16:25 | 8 |
Конечно знает. Справка по вашей версии компилятора знает как оно обрабатывается в вашей версии компилятора.
Только вдруг у вас Делфи5 какая-нибудь? Я с пятой не работал, вполне допускаю, что там может оказаться не так как в текущей. Проще и быстрее проверить. А ещё проще и эффективнее - последовать совету krapotkin'а.
0
|
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 56
|
|
13.06.2019, 16:43 [ТС] | 9 |
XE5
А по совету - ну так я и спросил для того чтобы правильно освободить память
0
|
пофигист широкого профиля
4732 / 3167 / 858
Регистрация: 15.07.2013
Сообщений: 18,251
|
|
14.06.2019, 02:26 | 10 |
+1
И не надо смотреть на версию! Береженого бог бережет. А все прочие идут лесом на север.
0
|
Житель Земли
|
|||||||||||
18.06.2019, 15:58 | 11 | ||||||||||
как вариант
1
|
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 56
|
|
18.06.2019, 17:41 [ТС] | 12 |
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 |
По моему, тут куча ответов. А вообще, если брать начальную постановку вопроса:
то достаточно ввести SetLength(a,0). Насколько я знаю все, что было создано не программистом (а SetLength - это как раз такая ситуация) не программистом же и должно быть удалено. А вот если используется New, то там без Dispose не обойтись. Сколько я имел дел с динамическими массивами и использовал SetLength столько раз я не получал утечек памяти по завершении программы (а я во время отладки всегда использую ReportMemoryLeaksOnShutdown). Как это относится к освобождению памяти как таковой? Если это поведение стандартное для Делфи, то, имхо, туда и не стоит лезть, потому что в 99% случаев это будет корректное поведение, а оставшийся 1% случаев - это, обычно, слишком явные косяки, типа попытки закачки гигабайтного массива в память.
0
|
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 56
|
|
19.06.2019, 04:35 [ТС] | 15 |
ну во первых, четкого ответа не было, только предположения или философствование
по памяти - у меня прога на серваке работает 24/7 соответственно если правильно не освобождать память, то рано или поздно она повиснет. По завершению прога сама все освобождает, тут дело касается работе непрерывно год, например Тут у дельфи есть особенности. Поэтому и спросил. А дальше к twebbrowser перейдем, который за 15 лет в плане утечки памяти так и не починили). Сейчас очень важно знать как для серверной проги очистить память, ответов подтвержденных фактами пока в теме не было, я лично сначала обнуляю вложенные массивы, а потом основной, но это какой то идиотизм
0
|
884 / 404 / 174
Регистрация: 20.10.2016
Сообщений: 1,828
|
|
19.06.2019, 04:41 | 16 |
У меня программа работает с массивами, каждые 15 минут массив чистится и заполняется вновь. Работает уже около 7 лет, ни разу не падала из-за утечек памяти, типичный срок непрерывной работы программы составляет год.
"Резервируется" и "не освобождается" вещи совершенно разные, так как "резервируется" может быть использовано повторно (и выделение памяти тогда происходит быстрее, так как область памяти уже есть в распоряжении программы), а "не освобождается" использоваться не может. Кто-то еще использует TWebBrowser? Зачем? Это визуальный компонент, и его надо использовать соответствующе, но я не могу придумать ни одного случая, когда надо использовать именно его. Ну так поставьте свою программу, пусть покрутится недельку на сервере, да посмотрите, что произойдет. Надо бороться с реальными проблемами, а не фантомными.
0
|
Модератор
|
|
19.06.2019, 04:42 | 17 |
Если мне склероз не изменяет, еще со времен Паскаля для этого использовалась процедура 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 |
Если мне мой склероз не изменяет, то это имеет смысл только в контексте существования Initialize. То есть если выделить память через New или Initialize (хотя с initialize не работал), то делфи автоматически память не освобождает даже для локальных переменных в процедурах.
учитывая мой опыт работы с этим компонентом (конечно, не берусь говорить, что я тут 100% прав), но он косячен до нереальности, с постоянными ошибками обработок скриптов и т.д. Но остается вопрос: а зачем обходить скриптовую защиту в вашей программе? Тогда забить. Все будет работать правильно, если используется 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 | |
19.06.2019, 07:52 | |
Помогаю со студенческими работами здесь
20
Освобождение памяти Освобождение памяти Pchar и освобождение памяти Освобождение памяти от объектов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |