![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| vdm |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 236 Регистрация: 16.10.2007 Репутация: нет Всего: нет |
Есть глобальная переменная в которую собераюсь хранить хэндл на событие. Перед тем, как положить в неё, создаю локальный хэндл и копирую его в глобадьный. После чего локальный хэндл освобождаю а глобальный продолжает работать. Так правильно или локальный хэндл после копирования его значения освобождать ненадо? П.с. чтобы невозникло вопросов - это тупо явный пример самой идеи. Важна инфо в правильности действий а не логики Это сообщение отредактировал(а) vdm - 1.3.2010, 17:57 |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| vdm |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 236 Регистрация: 16.10.2007 Репутация: нет Всего: нет |
За ним следует вопрос, а не получу ли утечку по памяти таким образом создпвая хэндлы? Привожу пример. Если в Debug mode установить 2 break point'a 1. перед выполнением первого цикла for() и на нём посмотреть в Task manager выделенную память и второй на return; - то здесь памяти будет больше чем на первой точке break point'a. Почему? Утечка?
|
||||
|
|||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Хэндл ты создаешь только один раз, а потом копируешь его значение. Поставь вместо "хэндл" слово "указатель" и подумай, надо ли освобождать "локальный" указатель после копирования его значения в глобальную переменную. Смысл один и тот же. Ни о чем не говорит. Выделенная память после освобождения сразу в систему не возвращается. Скажем, хип только растет... (хотя в нем может быть море свободного места, но системе об этом неизвестно). -------------------- ... |
|||
|
||||
| vdm |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 236 Регистрация: 16.10.2007 Репутация: нет Всего: нет |
День добрый, Earnest. Нет ненадо. Спасибо за дополнительное разъяснение. Немного выше GremlinProg уже дал ответ на этот вопрос. Это сообщение отредактировал(а) vdm - 2.3.2010, 16:32 |
|||
|
||||
| xvr |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
В твоем примере никаких 'локальных хэндлов' не создается. Для создания хэндла недостаточно присвоить его из одной переменной в другую, это создаст не 'копию хэндла', а отдублирует один и тот же хэндл в 2 перемнные. Т.ч. в твоем примере SetEvent в 8й строке даст ошибку, т.к. его хэндл был закрыт в 6й строке. Для создания дубликатов хэндлов служит функция DuplicateHandle
Все хэндлы, созданные любым путем (и через Create*, и через DuplicateHandle), надо закрывать через CloseHandle |
||||||
|
|||||||
| vdm |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 236 Регистрация: 16.10.2007 Репутация: нет Всего: нет |
xvr, а есть существенная разница между дублированием локального указателя через копирование его содержимого на другой (глобальный) указатель то есть (HANDLE) и копированием через ф-цию DublicateHandle? По мне особой разницы нет...
При чём DublicateHanle не уместен, если собераюсь HANDLE'ы хранить в куче как в 3 посте. Это сообщение отредактировал(а) vdm - 3.3.2010, 09:58 |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Конечно, есть, и весьма существенная. DublicateHandle создает НОВЫЙ хэндл на тот же объект ядра, поэтому его и надо закрывать отдельно. А присваивание просто копирует значение. В этом смысле хэндл ничем не отличается от других переменных. Ты копируешь хэндл (и любую другую переменную) каждый раз, когда передаешь его куда-нибудь по значению.
-------------------- ... |
|||
|
||||
| vdm |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 236 Регистрация: 16.10.2007 Репутация: нет Всего: нет |
Утро доброе Earnest, я к тому что DublicateHandle по теме не совсем уместен, так как нужна передача с локального хранилищя в глобальное. Что успешно и без последствий можно реализовать на примере 3 поста.
Это сообщение отредактировал(а) vdm - 3.3.2010, 10:13 |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
vdm, открой диспетчер задач на вкладке процессы, далее: Вид -> Выбрать столбцы... включи "Счетчик дескрипторов" а теперь смотри на его изменение в обоих примерах DublicateHandle тут указан к тому, чтобы ты не путался в понятиях "локальный дескриптор" и "локальная переменная", а в примерах - конечно, DublicateHandle не требуется -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Разница есть, но давай вернемся к первоисточнику - тема называется Создание глобального хэндла с помощью локального. Так вот, при копировании хэндла из локальной переменной в глобальную никакой 'глобальный хэндл' НЕ СОЗДАЕТСЯ. И вообще никакой хэндл не создается. Как исходно был один единственный хэндл, так он и остается одним единственным хэндлом (тем же самым). Просто теперь этот хэндл лежит в 2 ПЕРЕМЕННЫХ.
Это сообщение отредактировал(а) xvr - 3.3.2010, 13:25 |
||||
|
|||||
| vdm |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 236 Регистрация: 16.10.2007 Репутация: нет Всего: нет |
xvr,
|
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |