|
|
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич если у меня в потоке создаются огромные массивы - они остаются, занимая память Андрей Игоревич в компиляторе их можно прощелкать на всю глубину и посмотреть на нули ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2019, 17:54 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич, чтобы не ловить AV при освобождении несуществующего объекта, попробуй Код: pascal 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2019, 18:31 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Док Андрей Игоревич, чтобы не ловить AV при освобождении несуществующего объекта, попробуй Код: pascal 1. 2. 3. 4. Это и так делается внутри FreeAndNil, не учи человека плохому ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2019, 18:49 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov Андрей ИгоревичПо факту - Thread.Free не делает поток Nil Естественно не делает. Не забота объекта следить сколько у тебя указателей на него. Ты их можешь присвоить хоть миллион, хоть миллиард. Сам наплодил - самому и очищать. Это азы работы с указателями. Но почему для остальных классов деструктор очищает указатели, а для потоков - нет? И почему тогда штатный Free этого не учитывает (например как предложил Док) и после завершения потока вылетает с ошибкой доступа к памяти. _Vasilisk_ Андрей Игоревич если у меня в потоке создаются огромные массивы - они остаются, занимая память Андрей Игоревич в компиляторе их можно прощелкать на всю глубину и посмотреть на нули Надо потестировать, у других классов ведь полностью очищаются. А если у меня будет миллиард указателей в потоке (ну вдруг я так программирую) - они таки будут сжирать гигабайт памяти? Док Андрей Игоревич, чтобы не ловить AV при освобождении несуществующего объекта, попробуй Код: pascal 1. 2. 3. 4. Спасибо, очень пригодиться. А вот есть вопрос из другой оперы (из-за которого я опять вернулся к этому :) ) Вот запускаю я множество потоков, по результатам у меня происходит событие (ну так я сделал) в основном потоке, как сделать так что бы срабатывало только событие последнего выполняемого потока, считать потоки? При том я не знаю сколько у меня потоков и какой именно будет последним. Считать потоки в событии? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2019, 18:52 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Василий 2 Док Андрей Игоревич, чтобы не ловить AV при освобождении несуществующего объекта, попробуй Код: pascal 1. 2. 3. 4. Это и так делается внутри FreeAndNil, не учи человека плохому Если FreeOnTerminate:=true то FreeAndNil вылетит с ошибкой доступа к памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2019, 18:53 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич Если FreeOnTerminate:=true то FreeAndNil вылетит с ошибкой доступа к памяти. довольно низкоуровневый примитив что бы свободно применять его в юзер-коде для этого нужно очень веское основание ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2019, 19:15 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич Dimitry Sibiryakov пропущено... Естественно не делает. Не забота объекта следить сколько у тебя указателей на него. Ты их можешь присвоить хоть миллион, хоть миллиард. Сам наплодил - самому и очищать. Это азы работы с указателями. Но почему для остальных классов деструктор очищает указатели, а для потоков - нет? И почему тогда штатный Free этого не учитывает (например как предложил Док) и после завершения потока вылетает с ошибкой доступа к памяти. _Vasilisk_ пропущено... Нет пропущено... Вы видите случайный мусор того, что осталось по старым указателям Надо потестировать, у других классов ведь полностью очищаются. А если у меня будет миллиард указателей в потоке (ну вдруг я так программирую) - они таки будут сжирать гигабайт памяти? Dimitry Sibiryakov и _Vasilisk_ вам правильно написали, надо расти над собой сам навыделал, сам и чисти, мы же про системный язык, а не про яву рассуждаем??? хотя есть решения и для ленивых 11957089 Андрей Игоревич Док Андрей Игоревич, чтобы не ловить AV при освобождении несуществующего объекта, попробуй Код: pascal 1. 2. 3. 4. Спасибо, очень пригодиться. А вот есть вопрос из другой оперы (из-за которого я опять вернулся к этому :) ) Вот запускаю я множество потоков, по результатам у меня происходит событие (ну так я сделал) в основном потоке, как сделать так что бы срабатывало только событие последнего выполняемого потока, считать потоки? При том я не знаю сколько у меня потоков и какой именно будет последним. Считать потоки в событии? ну вот "посмотреть что делает этот метод" не судьба? или работать надо? не пользуйтесь FreeOnTerminate:=true и всё будет более-менее в порядке хотя с тем, что архитектура TThread вызывает много вопросов я очень даже согласен, но что есть то есть бага записанная в кучу копий, становится фичей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2019, 19:36 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич А если у меня будет миллиард указателей в потоке (ну вдруг я так программирую) - они таки будут сжирать гигабайт памяти? При выполнении этих правил никакая память утекать не будет. Док чтобы не ловить AV при освобождении несуществующего объекта, попробуй Код: pascal 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2019, 19:48 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan) FreeOnTerminate:=true это совсем другой расклад довольно низкоуровневый примитив что бы свободно применять его в юзер-коде для этого нужно очень веское основание Код: pascal 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2019, 19:53 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичНо почему для остальных классов деструктор очищает указатели Что-то ты путаешь. Ни для каких классов освобождение памяти не изменяет значение указателя. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2019, 19:55 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan) ну вот "посмотреть что делает этот метод" не судьба? или работать надо? А как правильно проверять существование потока? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2019, 19:57 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич А как правильно проверять существование потока? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2019, 20:05 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичА как правильно проверять существование потока? Правильно - никак. Потоки это оружие класс FaF. Ты его запускаешь, а дальше оно уже само. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2019, 20:10 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич kealon(Ruslan) ну вот "посмотреть что делает этот метод" не судьба? или работать надо? А как правильно проверять существование потока? 1. Если указатель на поток не сохраняется ("TMyThread2.Create;"), то никак. 2. Если указатель на поток сохраняется ("th := TMyThread2.Create;"), то обязательно самому FreeAndNil-ить поток и соответственно "существует" == "th <> nil". FreeOnTerminate - только для п.1 3. Если хочется проверить, завершился ли поток, то есть например ReturnValue, но его все равно надо будет выставить в Execute самому ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2019, 21:39 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Василий 2 3. Если хочется проверить, завершился ли поток, то есть например ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2019, 22:32 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
авторНо почему для остальных классов деструктор очищает указатели, Никакой класс не очищает указатель и TThread как представитель классов этого конечно же не делает. Надежно чистить указатель на TThread можно в OnTerminate потока, вне зависимости от флага FreeOnTerminate. Другое дело что проверка указателя на nil с включенным флагом FreeOnTerminate мало что гарантирует: 1. Делаем проверку на nil. Поток еще живой 2. Поток надумал закончится, зашел в OnTerminate, обнулил ссылку на себя 3. Обращаемся к потоку получаем AV. Из плюсов то, что OnTerminate выполняется синхронно с основным потоком. Поэтому могут существовать кейсы когда это будет работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2019, 23:02 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ kealon(Ruslan) FreeOnTerminate:=true это совсем другой расклад довольно низкоуровневый примитив что бы свободно применять его в юзер-коде для этого нужно очень веское основание Код: pascal 1. 2. 3. 4. makhaon авторНо почему для остальных классов деструктор очищает указатели, Никакой класс не очищает указатель и TThread как представитель классов этого конечно же не делает. Надежно чистить указатель на TThread можно в OnTerminate потока, вне зависимости от флага FreeOnTerminate. Другое дело что проверка указателя на nil с включенным флагом FreeOnTerminate мало что гарантирует: 1. Делаем проверку на nil. Поток еще живой 2. Поток надумал закончится, зашел в OnTerminate, обнулил ссылку на себя 3. Обращаемся к потоку получаем AV. Из плюсов то, что OnTerminate выполняется синхронно с основным потоком. Поэтому могут существовать кейсы когда это будет работать. налопшичить кучу кода, и всё ради "высвободить хэндл как поток завершится", ну и нафига? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2019, 00:52 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Док, советуешь феерическую хрень. че хрень-то сразу? :) В Лазаре, промежду прочим, если не подставлять эту прокладку, в некоторых случаях получаешь ошибку еще на этапе компиляции. Я сейчас точно ситуацию не воспроизведу кодом (лень, если честно). Но когда я плотно изучал работу потоков, частенько с этим сталкивался. kealon(Ruslan) не пользуйтесь FreeOnTerminate:=true и всё будет более-менее в порядке им нужно пользоваться, только надо знать где и как :) Я для себя определил так: - если экземпляр потока объявлен в локальной переменной, то FreeOnTerminate:=true, ибо после выхода из процедуры видимость переменной все равно потеряется и nil-ить ее специально нет никакой необходимости. - во всех остальных случаях FreeOnTerminate:= false и FreeAndNil. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2019, 01:12 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Док че хрень-то сразу? :) В Лазаре, промежду прочим, если не подставлять эту прокладку, в некоторых случаях получаешь ошибку еще на этапе компиляции. Я сейчас точно ситуацию не воспроизведу кодом (лень, если честно). Но когда я плотно изучал работу потоков, частенько с этим сталкивался. Внутри FreeAndNil и так вызывается проверка на Assigned, как и в Free. Вот, че. Уже ж проходили много раз. А если в указателе (в "переменной объекта") мусор, то эта проверка - абсолютно бесполезна к тому же. Док - если экземпляр потока объявлен в локальной переменной, то FreeOnTerminate:=true Если ждать результатов выполнения потока не нужно, если не нужно управлять потоком - то можно можно использовать FreeOnTerminate, я бы сказал так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2019, 01:41 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
YuRock Если ждать результатов выполнения потока не нужно, если не нужно управлять потоком - то можно можно использовать FreeOnTerminate, я бы сказал так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2019, 08:36 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
YuRock При чем тут Лазарь-не Лазарь, потоки... Внутри FreeAndNil и так вызывается проверка на Assigned, как и в Free. В лазаре так (fpc3.0.4: ..\source\rtl\objpas\sysutils\sysutils.inc) Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. Возможно в дельфях по-другому, давно в потроха не заглядывал kealon(Ruslan) при выходе из программы стопорнуть поток как правило всё равно надо это ты о чем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2019, 08:51 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Док В лазаре так (fpc3.0.4: ..\source\rtl\objpas\sysutils\sysutils.inc) Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. Возможно в дельфях по-другому, давно в потроха не заглядывал Ты в потроха TObject.Free загляни и узнаешь великую тайну - чем он отличается от .Destroy :) Док kealon(Ruslan) при выходе из программы стопорнуть поток как правило всё равно надо это ты о чем? Подозреваю он о том, что при завершении программы нельзя оставлять в памяти работающие потоки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2019, 09:43 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич, может так проще будет: автор Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. А внутреннюю очистку как-то самостоятельно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2019, 09:44 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan) YuRock Если ждать результатов выполнения потока не нужно, если не нужно управлять потоком - то можно можно использовать FreeOnTerminate, я бы сказал так. kealon(Ruslan) Кроме того, при выходе из программы стопорнуть поток как правило всё равно надо, и тут начинаются проблемы. Если надо все же вручную закрывать - значит FreeOnTerminate не подходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2019, 10:17 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Док В лазаре так (fpc3.0.4: ..\source\rtl\objpas\sysutils\sysutils.inc) Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. Возможно в дельфях по-другому, давно в потроха не заглядывал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2019, 10:18 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39892622&tid=2038666]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
196ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 243ms |
| total: | 525ms |

| 0 / 0 |
