Утечки памяти в расширении Explorer
У нас есть расширение проводника, позволяющее пользователю просматривать содержимое нашего внешнего устройства. Расширение работает нормально, но после ночи автоматического тестирования объем памяти процесса проводника увеличился. Я провел целый день, настраивая среду, в которой я могу использовать UMHD для создания снимков процесса проводника, а затем сравнивать их, чтобы увидеть, какие утечки. Он указывает на несколько разных функций, но, согласно документам, мы используем их правильно.
SHGetNameFromIDList
Эта функция вызывается для получения имени папки в GetDisplayNameOf
реализация. После использования возвращенной строки она освобождается с помощью CoTaskMemFree
функционировать как указано. Однако, согласно UMHD, этот процесс иногда приводит к утечке памяти. Но только иногда. Для одного теста я насчитал>5000 вызовов этой функции, но только ~1% из них просочились. Я также проверил, что ни один из вызовов не вернул код ошибки. Есть ли какие-то проблемы с потоками, о которых мне нужно знать??
Другое дело, я вижу (в трассировке стека), что функция ntdll!RtlpAllocateHeap
используется для выделения памяти, а не CoTaskMemAlloc
что вы могли ожидать.
SHCreateDataObject
Эта функция используется в GetIOObjectOf
реализация, а также утечки. Кажется, объект, выделенный нами здесь, никогда не освобождается исследователем. Должны ли мы освободить это? В таком случае когда?
_vsnprintf_s
Эта функция также использует ntdll!RtlpAllocateHeap
функция, чтобы выделить то, что утечка. Зачем??
Я на W10 Pro 1803.
Кроме того, при проверке сравнения между снимками, только небольшая часть утечек фактически включает наш код. Похоже, исследователь очень плохо вытекает из коробки.
Какие-либо предложения?