2015-01-09 5 views
0

Как освободить виртуальную память, оставшуюся после вызова TerminateThread? Это можно сделать через VirtualFree и как, конечно. Я полностью понимаю «Опасности» от TerminateThread.Очистка после TerminateThread?

+2

Нет, не может. Это побочный эффект TerminateThread – Matt

+0

@Matt В Vista + виртуальная память очищается. Поэтому я говорю о XP и раньше. –

+1

Лучшее, что вы можете сделать после вызова TerminateThread, - это также закрыть дескриптор для него - по крайней мере, разрешить удаление объекта потока. Но для выделенной памяти (и стека потоков до Windows XP и сервера 2003) - окончательные утечки памяти до завершения процесса. –

ответ

4

В неуправляемом процессе нет реалистичного способа убрать память извне.

Память может быть разделена различными способами. В конечном счете все начинается с звонков VirtualAlloc, VirtualAllocEx и т. Д. Но на практике библиотеки времени выполнения всегда используют вспомогательные распределяющие кучи-менеджеры. Эти распределители кучи получат память по звонкам до VirtualAlloc, но затем раздадут подблоки. Администраторы кучи обычно разделяются между потоками в процессе. Таким образом, у вас нет возможности извне узнать, как освободить эти подблоки.

И даже если бы у нас не было распределителей, как вы могли узнать, какие блоки были разданы VirtualAlloc, вам разрешили уничтожить? Поток может выделять память с вызовом VirtualAlloc и требовать, чтобы память выделяла поток выделения и уничтожалась другим потоком.

Но если вы счастливы, чтобы все это идти, и просто хотите стек быть уничтожены (в соответствии с вашими комментариями), то эта статья покажет вам, как сделать это с RtlFreeUserThreadStack: http://www.nicklowe.org/2012/01/thread-termination-dont-leak-the-stack/

+1

Довольно вероятно, что вам не хватает точки вопроса.В потоках не указано адресное пространство VirtualAlloc-ed, процесс выполняется. За исключением одной детали, пространство стека выделено для потока с помощью CreateThread(). Это действительно выпущено автоматически в Vista +, но не в более ранних версиях. –

+1

@HansPassant Какой смысл выпускать стек и оставлять все остальное? И потоки владеют стеком, да. Но процессы владеют потоками. Таким образом, в конечном итоге процессы тоже владеют стеком. –

+1

Конечно, избавиться от утечки адресного пространства. Не существует «всего остального», которое невозможно освободить. –

Смежные вопросы