Простой способ найти утечки ручек состоит в том, чтобы регистрировать все.
Каждый раз, когда вы получаете ручку, регистрируйте ее, а также любые другие подробности об обстоятельствах. Каждый раз, когда вы отпускаете ручку, регистрируйте, что вы выпустили ее. Включите оба раза фактический дескриптор (только некоторые шестнадцатеричные).
Тогда вы получите журнал, который выглядит так (только для примера):
Obtained handle 0xf000 (nLineNo = 5)
Obtained handle 0xb000 (nLineNo = 6)
Obtained handle 0xd0d0 (nLineNo = 7)
Released handle 0xf000
Released handle 0xb000
Выбрав это вручную, вы можете видеть, что вы получили дескриптор 0xd0d0, когда nLineNo было 7, и он никогда не был выпущен. Это не так много, но это помогает, и если дела идут плохо, вы можете даже попробовать записывать трассировки стека при каждом получении / выпуске. Кроме того, если журнал всегда надежно создается таким образом, вы можете начать вводить точки останова на основе фактических значений (например, разрыв в точке в программе, когда дескриптор равен 0xd0d0, чтобы вы могли видеть, что с ним происходит).
Если это более практично, вы можете начать оборачивать свои дескрипторы в самой программе, например std::set
всех полученных дескрипторов, а также любые подробности о том, когда они были получены, и вы можете эффективно приступить к взлому вашей программы, чтобы отследить, что она делает (затем отменить все ваши изменения, как только вы ее исправили).
Надеюсь, что это помогает - это одна из причин, по которой я стремлюсь, по крайней мере, сохранить std::set
всего, что получаю, поэтому, если худший из них окажется худшим, вы можете перебрать их при завершении работы и отпустить их все (и записать большой файл) ИСПРАВИТЬ ЭТО! "Сообщение!)