У меня есть простая программа на C ++, уменьшенная до 272 строк кода, которая инициализирует Direct2D, затем выполняет цикл из 1000 операций, где она просто создает ID2D1GradientStopCollection с последующим созданием использования ID2D1LinearGradientBrush, а затем немедленно их освобождает (количество выпусков падает доноль на вызовах Release, что указывает на то, что они обычно должны быть нераспределенными).
Однако после каждого выполнения этого цикла я вижу, что память, зарезервированная процессом, увеличивается, и она освобождается только в конце,как только фабрики и устройства direct2D будут выпущены, вместо того чтобы выпускаться после каждого вызова linearGradientBrush-> Release () и GradientStopCollection-> Release (), как я и ожидал.
Странная вещь заключается в том, что когда я создаю /удалите SolidColorBrush вместо LinearGradientBrush (все еще создавая / удаляя GradientStopCollection), тогда утечки памяти больше не наблюдается.
Я что-то не так сделал, вызвав, например,dientStopCollection будет по-прежнему выделяться, потому что все еще используется кистью?(Но я не вижу в этом случае, почему счетчик ссылок после вызова Release для двух объектов падает до нуля; а также, если я добавляю AddRef или удаляю Release, чтобы вызвать неправильный счетчик AddRef / Release наобъекты (и получают ненулевой счетчик ссылок в конце программы), затем слои отладки Direct2D указывают на ошибку внутри d2d1debug3.dll, вызывающую kernelbase.dll в стеке вызовов, таким образом показывая, что счетчик AddRef / Release правильный;все же я все еще наблюдаю эту утечку памяти с помощью TaskManager).
Любая помощь в том, как решить эту проблему, будет оцененана платформе x86 / x64 формы отладки / выпуска