Как освободить виртуальную память, оставшуюся после вызова TerminateThread
? Это можно сделать через VirtualFree
и как, конечно. Я полностью понимаю «Опасности» от TerminateThread
.Очистка после TerminateThread?
ответ
В неуправляемом процессе нет реалистичного способа убрать память извне.
Память может быть разделена различными способами. В конечном счете все начинается с звонков VirtualAlloc
, VirtualAllocEx
и т. Д. Но на практике библиотеки времени выполнения всегда используют вспомогательные распределяющие кучи-менеджеры. Эти распределители кучи получат память по звонкам до VirtualAlloc
, но затем раздадут подблоки. Администраторы кучи обычно разделяются между потоками в процессе. Таким образом, у вас нет возможности извне узнать, как освободить эти подблоки.
И даже если бы у нас не было распределителей, как вы могли узнать, какие блоки были разданы VirtualAlloc
, вам разрешили уничтожить? Поток может выделять память с вызовом VirtualAlloc
и требовать, чтобы память выделяла поток выделения и уничтожалась другим потоком.
Но если вы счастливы, чтобы все это идти, и просто хотите стек быть уничтожены (в соответствии с вашими комментариями), то эта статья покажет вам, как сделать это с RtlFreeUserThreadStack
: http://www.nicklowe.org/2012/01/thread-termination-dont-leak-the-stack/
Довольно вероятно, что вам не хватает точки вопроса.В потоках не указано адресное пространство VirtualAlloc-ed, процесс выполняется. За исключением одной детали, пространство стека выделено для потока с помощью CreateThread(). Это действительно выпущено автоматически в Vista +, но не в более ранних версиях. –
@HansPassant Какой смысл выпускать стек и оставлять все остальное? И потоки владеют стеком, да. Но процессы владеют потоками. Таким образом, в конечном итоге процессы тоже владеют стеком. –
Конечно, избавиться от утечки адресного пространства. Не существует «всего остального», которое невозможно освободить. –
- 1. Очистка потоков в DLL: _endthreadex() против TerminateThread()
- 2. Delphi TerminateThread эквивалент для Android
- 3. $ location.search - очистка после использования
- 4. Очистка FutureTask после использования
- 5. Очистка каталога после GCC
- 6. Очистка после av_frame_get_buffer
- 7. очистка после использования SwingWorker
- 8. Очистка После процесса убийства
- 9. Очистка после потока Java8
- 10. Очистка после вызова GetSystemMenu()
- 11. Очистка после установки OpenCV
- 12. Jenkins - очистка после работы
- 13. очистка после испытаний уклонатора
- 14. Очистка после сеанса PHP
- 15. Когда поток фактически завершается при вызове TerminateThread?
- 16. Can TerminateThread прекратить поток из другого процесса?
- 17. Прекращение потока изящно не использующего TerminateThread()
- 18. Очистка полей диалога после использования
- 19. очистка строки java после цикла
- 20. Очистка пути CGPath после рисования
- 21. Очистка после неудачных сбоев сборки
- 22. Очистка сервера после отсоединения клиента
- 23. Очистка полей после ошибки проверки
- 24. Очистка AppBar после процесса kill
- 25. Очистка после внешней библиотеки Java
- 26. Очистка после каждого класса junit
- 27. Очистка после многократного докер вставляет
- 28. Очистка фляжки DB после pageload
- 29. Очистка QThread после вызова quit()
- 30. Очистка после приложения Scotty завершена
Нет, не может. Это побочный эффект TerminateThread – Matt
@Matt В Vista + виртуальная память очищается. Поэтому я говорю о XP и раньше. –
Лучшее, что вы можете сделать после вызова TerminateThread, - это также закрыть дескриптор для него - по крайней мере, разрешить удаление объекта потока. Но для выделенной памяти (и стека потоков до Windows XP и сервера 2003) - окончательные утечки памяти до завершения процесса. –