powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
25 сообщений из 135, страница 1 из 6
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39883175
Я понимаю, что в литературе всё это описано, но иногда не получается найти ответы (обычно знаешь где искать уже когда знаешь ответ). Сильно не бейте за безграмотность в программировании, я любитель.
Я в программе постоянно в огромных количествах работаю с записями состоящими из динамических массивов очень глубокой вложенности и размеров. Так же бывают классы с глубокой вложенностью других классов;
Записи по сути представляют из себя описание конструкции с множеством параметров:
Абстрактный пример, на случай если у вас есть претензии к самой структуре, у меня другая конструкция, но суть такая же
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
ТВелосипед = запись
 Колесо: arrary of ТКолесо;
 Рама: ТРама;
 Руль: ТРуль;
 Дигало:ТДвигало;
 и т.д
Конец;

ТКолесо = запись
 Обод:ТОбод;
 Покрышка:...
 Спица: array of ТСпица;
 ну и т.д.
Конец;

ТСпица = запись
 УчастокСпицы:array of ТУчасток;
Конце;

ТДвигало = запись
 Педали: ТПедали; 
 Цепь: ну и так далее, массивы всякие и прочее
Конец;
Var
 Куча_велосипедов:array of TВелосипед;




С выделением памяти особых проблем нет (если не выделил - сразу словишь ошибку и поправишь), то вот с высвобождением есть вопросы;

1. Если у меня динамические массивы глубокой вложенности, тот воспользовавшись SetLenght(Array,0) никаких потерь памяти не будет? Вопрос возник после прочтения данной темы https://www.programmersforum.ru/showthread.php?t=126357

2. Если у меня динамический массив классов, если после выделения памяти класса уменьшу массив - память станет недоступна (утечка)? Очистка созданных классов обязательна перед уменьшением массива?
Пример
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 TTemp = class
  Data:TData;
 end;
var
 TempArray: array of TTemp;
 i:integer;
Begin
 SetLenght(TempArray,10);
 for i:=0 t0 lenght (TempArray)-1 do 
  TempArray[i].Create;

///...

SetLenght (TempArray,0);
//что происходит с созданными объектами?
end;


3.1. При создании в классе агрегированых классов (ClassB)
Код: pascal
1.
2.
3.
TClassA = class 
   ClassB: TClassB;
End;


При использовании ClassA.Free (или Destroy) будет ли опустошена память которую я выделил под ClassB сама? На данный момент я делаю так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
TClassA = class 
   ClassB: TClassB;
   Destructor  Destroy; override;
End;

destructor TClassA .Destroy;
begin
  if ClassB<>nil then ClassB.Destroy;
  inherited;
end;


Это корректно? Или излишне?


3.2. То же что и 3.1 но если дело будет в потоке, когда поток будет завершен - очиститься ли память от всяких созданных в нем классов, или тоже надо дополнять деструктор?

4. Чуть на другую тему - у меня в Delphi 7 при завершении кода в потоке память не очищается, надо дополнительно использовать Thread.Free; В Делфи 10 такой проблемы нет, после завершения кода память высвобождается. Как в Delphi 7 корректно очистить память после завершения кода потока? (никак не перееду на Delphi 10 ибо раздражают эти мигающие и дергающиеся окошки при компиляции при работе на нескольких мониторах)

5. FreeAndNil применительно к вопросам выше - очистит ли память от агрегированных классов автоматом, если нет - вызовет ли переназначенный деструктор?

6. Если я хочу очистить запись со вложенными динамическими массивами (без классов) до состояния, которое было при её создании, что нужно сделать? Finalize сбросит ли размеры массивов до нулевых? Вроде как через указатели и Get/FreeMem можно, но насколько это корректно? Можно, конечно, создать темповый массив и присваивать его обнуляемому, но как-то костыльно.

7. Ну и вопрос, наверное даже на отдельную тему, но может есть простое решение. Можно ли как нибудь в 32 битной системе решить проблему ограничением на размеры массива.
Один элемент массива в памяти занимает 200-300 мегабайт:
в скомпилированном в Delphi 7 приложении: после 7го увеличения массива вылетает OutOfMemory;
в скомпилированном в Delphi 10 (32 bit) - где-то посл 25го - OutOfMemory;
в скомпилированной в Delphi 10 (64 bit) - открывает сколько угодно (ну сотню точно)
Можно ли как-то решить данную проблему без компиляции в 64битной делфе, так как интерцейс новой делфи мне пока не очень нравится? Кто-то писал про какие-то распределенные массивы (не понял что это). Может через указатели? И без использования БД! :)

Я понимаю, что наиболее логичным мне ответом было бы: - "Иди книжки/Хелп читай". Но в книгах как-то уж очень часто такие вещи опускаются как очевидные, а хелп - это просто уничтожитель времени, зашел, просидел пол дня, ничего не понял :).
Заранее огромное спасибо тем, кто заглянул сюда.
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39883198
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич,

Вот здесь есть очень наглядный пример:
https://programmersforum.ru/showthread.php?t=126357
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39883204
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич,

1. Всё почистится, утечек не будет
2. Массив будет освобождён, объекты повиснут в памяти
3.1. Объекты сами не очистятся, нужно удалять в деструкторе. Проверка на NIL лишняя
3.2. Тот же ответ, что и в 3.1.
4. У потока есть свойство FreeOnTerminate
5. FreeAndNil это то же самое, что и Free, но дополнительно обнуляет переменную. Ничего дополнительно очищать не будет (ну в исходники-то можно заглянуть, а?
6. Finalize зачистит поля только управляемых типов (строки, дин. массивы, интерфейсы, варианты), все остальные поля остануться неизменёнными. Если требуется полное обнуление, то после Finalize нужно вызвать FillChar
7. Поддержка 64 бит появилась уже в XE2, не обязательно десятку ставить. Вместо массивов можно навелосипедить абстракцию, которая будет иметь интерфейс массива, а внутри раскладывать элементы по блокам и хранить список блоков (например, массив размером в 1000 элементов, при размере блока в 256 элементов, будет замещён в 4 блоках). Но без дженериков напляшешься пользоваться такими структурами. А если брать версию, где есть дженерики... то уж лучше 64 бита :)
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39883216
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyПроверка на NIL лишняяЕсли вызывать Free. А у него Destroy
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39883217
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Точно, не доглядел.
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39883222
GerasimenkoАндрей Игоревич,
Вот здесь есть очень наглядный пример:
https://programmersforum.ru/showthread.php?t=126357 Андрей Игоревич1. Если у меня динамические массивы глубокой вложенности, тот воспользовавшись SetLenght(Array,0) никаких потерь памяти не будет? Вопрос возник после прочтения данной темы https://www.programmersforum.ru/showthread.php?t=126357
Ну так этож та же тема, и там пишут - что не освобождается (или я чего не понял). Но
Kazantsev AlexeyАндрей Игоревич,
1. Всё почистится, утечек не будет
Непонятно...
Kazantsev AlexeyПроверка на NIL лишняя
Проверка на nil на случай если я не создал объект (я там их сотнями создаю и уничтожаю в процессе, в конце только часть существует).
А хотя Free и так проверяет на nil..., ну тогда да, хотя что-то у меня с этим было неприятное, с тех пор проверяю.
Kazantsev Alexey У потока есть свойство FreeOnTerminate
Точно, как я о нем забыл... По тестирую.
Kazantsev AlexeyFinalize зачистит поля только управляемых типов (строки, дин. массивы, интерфейсы, варианты), все остальные поля остануться неизменёнными. Если требуется полное обнуление, то после Finalize нужно вызвать FillChar

Тут главный вопрос - сбросит ли сами размеры дин масивов до нуля.
Kazantsev Alexey7. Поддержка 64 бит появилась уже в XE2, не обязательно десятку ставить. Вместо массивов можно навелосипедить абстракцию, которая будет иметь интерфейс массива, а внутри раскладывать элементы по блокам и хранить список блоков (например, массив размером в 1000 элементов, при размере блока в 256 элементов, будет замещён в 4 блоках). Но без дженериков напляшешься пользоваться такими структурами. А если брать версию, где есть дженерики... то уж лучше 64 бита :)
Как-то сложновато и нерационально на первый взгляд. А есть 10я версия делфи сопоставимая по удобности и интерфейсу с 7кой с кучей плагинов (цветные линии, подсветка выделенных переменных, куча всего по мелочи)? И можно сделать, чтоб 10ка при компиляции не сходила с ума масштабируя себя 10 раз (зачем-то перебрасывает окно на основной монитор, затем растягивает, затем ещё что-то делает) и тратя на это в 10 раз больше времени, чем на компиляцию?
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39883226
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич,

https://programmersforum.ru/showthread.php?t=126357 Оттуда
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
type
  testArray = array of array of integer;
  TestArray1 = array of integer;
..........
var
  t: TestArray;
  P: Pointer;
begin
  P := nil;
  SetLength(t, 2);
  SetLength(t[0], 2); {первый массив Integer на два элемента}
  SetLength(t[1], 4); {второй массив Integer на 4-ре элемента}

  P:= t[1];

  t[0][0] := 100;
  t[0][1] := -1;

  t[1][0] := 1000;
  t[1][1] := 2000;
  t[1][2] := 3000;
  t[1][3] := 4000;

  if p <> nil then ShowMessage('Ага!');
  SetLength(t, 0);
  ShowMessage(IntToStr(TestArray1(p)[1]));
end;




Проверте на своем массиве
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39883233
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ИгоревичНепонятно...
http://docwiki.embarcadero.com/RADStudio/Rio/en/Dynamic_array#Dynamic_Arrays Dynamic arrays of length 0 have the value nil.
Так понятнее?

Андрей ИгоревичТут главный вопрос - сбросит ли сами размеры дин масивов до нуля.
Я же написал, что зачистит.

Андрей ИгоревичА есть 10я версия делфи сопоставимая по удобности и интерфейсу с 7кой с кучей плагинов (цветные линии, подсветка выделенных переменных, куча всего по мелочи)?
Понятия не имею, я всю эту светомузыку отключаю.

Андрей ИгоревичИ можно сделать, чтоб 10ка при компиляции не сходила с ума масштабируя себя 10 раз (зачем-то перебрасывает окно на основной монитор, затем растягивает, затем ещё что-то делает) и тратя на это в 10 раз больше времени, чем на компиляцию?
Можно поставить не десятку и жить спокойно.
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39883234
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gerasimenko,

Освобождаемая память очищаться не обязана.
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39883238
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyGerasimenko,

Освобождаемая память очищаться не обязана.И? Пример то как раз и хорош! Я бы даже сказал, отличный.
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39883248
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GerasimenkoИ? Пример то как раз и хорош! Я бы даже сказал, отличный.
Если память освободили, но не очистили, она ещё сколько угодно будет сохранять прежние данные, пока они не будут затёрты новыми. А код зашибись, конечно. Читать по протухшему указателю это прям то что нужно.
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39883252
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyGerasimenkoИ? Пример то как раз и хорош! Я бы даже сказал, отличный.
Если память освободили, но не очистили, она ещё сколько угодно будет сохранять прежние данные, пока они не будут затёрты новыми. А код зашибись, конечно. Читать по протухшему указателю это прям то что нужно.На грабли легко наступить, как выше Вам писали авторЕсли вызывать Free. А у него Destroy
Грабли: они везде расставлены...
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39883262
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GerasimenkoНа грабли легко наступить, как выше Вам писали
Ага, только там всё-же Free оказался.
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39883296
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ИгоревичТут главный вопрос - сбросит ли сами размеры дин масивов до нуля.

Finalize ничего не делает с размерами массивов, она просто проходится по всем вложенным массивам и записям и освобождает память, занятую под управляемые типы (string, interface и т.п.). Причём только освобождает (т.е. уменьшает счётчики ссылок и делает FreeMem() при необходимости), ЕМНИП она даже не изменяет сами значения полей. SetLength(SomeArray, 0) вызывает Finalize автоматом, если знает что в массиве есть управляемые типы.
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39883319
Sinemurius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И можно сделать, чтоб 10ка при компиляции не сходила с ума масштабируя себя 10 раз (зачем-то перебрасывает окно на основной монитор, затем растягивает, затем ещё что-то делает) и тратя на это в 10 раз больше времени, чем на компиляцию?
В заголовке Delphi есть выпадающий список desktop-ов.
Когда Вы открыли проект, то у Вас скорее всего установлен desktop "Default Layout".
Затем Вы запускаете проект на отладку, и у Вас меняется desktop на "Debug Layout". По какой то причине, у Вас в этом Desktop-е окно Delphi настроено на расположение в другом мониторе.
Соответственно, в режиме отладки переместите среду Delphi на тот монитор, который Вам нужен, потом нажмите на кнопочку рядом с выпадающим списком desktop-ов и выберите Save desktop.
После этого, расположение окон в desktop-е "Default Layout" сравняется с desktop-ом "Debug Lauout". И после этого, у Вас при запуске проекта на отладку перестанут дергаться окошки.
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39883443
Kazantsev AlexeyАндрей ИгоревичА есть 10я версия делфи сопоставимая по удобности и интерфейсу с 7кой с кучей плагинов (цветные линии, подсветка выделенных переменных, куча всего по мелочи)?
Понятия не имею, я всю эту светомузыку отключаю.

Помню-помню, настоящие программисты пишут код исключительно в блокноте - остальное от лукавого :).
Просто привык уже этому и сильно ускоряет поиск ошибок.

Kazantsev Alexey http://docwiki.embarcadero.com/RADStudio/Rio/en/Dynamic_array#Dynamic_Arrays Dynamic arrays of length 0 have the value nil.Так понятнее?alekcvpАндрей ИгоревичТут главный вопрос - сбросит ли сами размеры дин масивов до нуля.
Finalize ничего не делает с размерами массивов, она просто проходится по всем вложенным массивам и записям и освобождает память, занятую под управляемые типы (string, interface и т.п.). Причём только освобождает (т.е. уменьшает счётчики ссылок и делает FreeMem() при необходимости), ЕМНИП она даже не изменяет сами значения полей. SetLength(SomeArray, 0) вызывает Finalize автоматом, если знает что в массиве есть управляемые типы.
Понял, спасибо, просто не был уверен, что это делается на всю глубину.
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39883467
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче.
Есть управляемые типы - дин.массивы, строки. Их освобождение - за компилятором. Вручную можно освободить присвоив соответственно nil или '' либо setlength(0).
В записях тоже работает это правило, и все управляемые поля записи также освобождаются автоматом - об этом заботится Finalize.

Есть классы, которые надо создавать и удалять самому.

ТС-у: первой строкой в проекте сделай ReportMemoryLeaksOnShutdown := True; и не гадай на кофейной гуще. А еще лучше - скачай FastMM, подключи его первым модулем в файле проекта и в FastMM4Options.inc в строке {.$define FullDebugModeWhenDLLAvailable} удали точку. Тогда будешь детально видеть, есть ли утечка и что конкретно утекло
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39883476
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...продолжается дезинформационная кампания, совмещенная с вирусной рекламой фастмм4.
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39883491
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёё...продолжается дезинформационная кампания, совмещенная с вирусной рекламой фастмм4.
"Когда вы говорите, Иван Васильевич, такое впечатление, что вы бредите"
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39883803
А как именно FreeOnTerminate завершает поток и очищает память?
Пример:
В делфи7 я могу открыть в потоке 7 массивов за раз.
Если FreeOnTerminate:=false и перед вызовом массива я предварительно FreeAndNil(Thread) - то я могу раз за разом открывать эти 7 массивов;
Если FreeOnTerminate:=true и я ничего не делают перед очередным переотркытием файлов - то 7 я уже отрыть не могу, вылетает ошибка нехватки памяти. Но если открывать по одному (и, вероятно, по 6), то хоть 7, хоть 100 - ничего не вылетает.
Итого получается, что FreeOnTerminate оставляет что-то в памяти, но потом как-то высвобождает (при вызове?)...

Ну и при FreeOnTerminate проверка Thread<>nil - проходит, но при вызове чего бы то ни было (free,Terminate), вылетает ошибка.
Как оно работает?
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39883811
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мда. FreeOnTerminate освобождает память, фактически вызывает MyThread.Free. Никакой связи с тем. что там в потоке делалось тут нет.
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39883814
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Объект" потока и собственно поток имеют только тут связь, что первое удобно инкапсулирует управление вторым. Но не более того.
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39883836
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ИгоревичА как именно FreeOnTerminate завершает поток и очищает память?
Пример:
В делфи7 я могу открыть в потоке 7 массивов за раз.
Если FreeOnTerminate:=false и перед вызовом массива я предварительно FreeAndNil(Thread) - то я могу раз за разом открывать эти 7 массивов;
Если FreeOnTerminate:=true и я ничего не делают перед очередным переотркытием файлов - то 7 я уже отрыть не могу, вылетает ошибка нехватки памяти. Но если открывать по одному (и, вероятно, по 6), то хоть 7, хоть 100 - ничего не вылетает.
Итого получается, что FreeOnTerminate оставляет что-то в памяти, но потом как-то высвобождает (при вызове?)...

Ну и при FreeOnTerminate проверка Thread<>nil - проходит, но при вызове чего бы то ни было (free,Terminate), вылетает ошибка.
Как оно работает?
FreeOnTerminate := True просто автоматом вызывает TThread.Destroy() после того как завершится выполнение TThread.Execute(). Всё что вы там выделили внутри этого потока - вам же и освобождать в своём деструкторе.
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39892496
alekcvp
Андрей ИгоревичА как именно FreeOnTerminate завершает поток и очищает память?
Пример:
В делфи7 я могу открыть в потоке 7 массивов за раз.
Если FreeOnTerminate:=false и перед вызовом массива я предварительно FreeAndNil(Thread) - то я могу раз за разом открывать эти 7 массивов;
Если FreeOnTerminate:=true и я ничего не делают перед очередным переотркытием файлов - то 7 я уже отрыть не могу, вылетает ошибка нехватки памяти. Но если открывать по одному (и, вероятно, по 6), то хоть 7, хоть 100 - ничего не вылетает.
Итого получается, что FreeOnTerminate оставляет что-то в памяти, но потом как-то высвобождает (при вызове?)...

Ну и при FreeOnTerminate проверка Thread<>nil - проходит, но при вызове чего бы то ни было (free,Terminate), вылетает ошибка.
Как оно работает?

FreeOnTerminate := True просто автоматом вызывает TThread.Destroy() после того как завершится выполнение TThread.Execute(). Всё что вы там выделили внутри этого потока - вам же и освобождать в своём деструкторе.
Я несколько не о том (или о том).
Примитивный код:
unit1
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
var
  Form1: TForm1;
  MyThread:Thread;
implementation

{$R *.xfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  MyThread:=Thread.Create(True);
  MyThread.FreeOnTerminate:=True;
  MyThread.Resume;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 MyThread.Free;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  MyThread:=Thread.Create(True);
  MyThread.FreeOnTerminate:=false;
  MyThread.Resume;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  if  MyThread<>nil then ShowMessage('Поток не nil') else ShowMessage('Поток nil');
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
   FreeAndNil(MyThread);
end;


unit2
Код: pascal
1.
2.
3.
4.
5.
procedure Thread.Execute;
begin

    ShowMessage('&#207;&#238;&#242;&#238;&#234; &#226;&#251;&#239;&#238;&#235;&#237;&#232;&#235; &#226;&#241;&#229; &#231;&#224;&#228;&#224;&#247;&#232;');
end;





По факту - Thread.Free не делает поток Nil
Thread.FreeOnTerminate:=True; - тоже не делает поток nil.

насколько я понимаю - они только обнуляют все данные, если у меня в потоке создаются огромные массивы - они остаются, занимая память (хотя и обновляются) (в компиляторе их можно прощелкать на всю глубину и посмотреть на нули)
Ну и соответственно проверка на nil тоже не проходит, поток не nil, но вызвать free - уже нельзя, вылетит ошибка памяти
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39892498
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ИгоревичПо факту - Thread.Free не делает поток Nil

Естественно не делает. Не забота объекта следить сколько у тебя указателей на него. Ты их
можешь присвоить хоть миллион, хоть миллиард. Сам наплодил - самому и очищать.

Это азы работы с указателями.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 135, страница 1 из 6
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]