Функция FindAll UIAutomation приводит к утечке памяти в моей системе даже при вызове array-> Release. Смотрите «утечка памяти» в примере программы ниже. Я провел некоторый поиск переполнения стека, и я видел несколько комментариев о том, что сборка мусора в памяти занимает около 3 минут, но я вижу, что произошла утечка памяти. Обратите внимание, что нижеприведенная программа не имеет malloc или new.
Я использую Windows 7 с пакетом обновления 1. cl версия:
32-разрядная версия оптимизирующего компилятора C / C ++ Microsoft (R) 16.00.40219.01 для 80×86.
/* Program to demonstrate that IUIAutomation function FindAll leaks memory.
* Build with: cl uia_memleak.cpp user32.lib ole32.lib oleaut32.lib
*/
#include <windows.h>
#include <stdio.h> /* for fprintf */
#include <assert.h> /* for assert */
#include <UIAutomation.h>
#include <oleauto.h>/* Forward declarations */
void loop_get_buttons(IUIAutomation * pui, HWND hwnd, int iterations);
int get_buttons(IUIAutomation * pui, HWND hwnd);
BOOL button_appender(IUIAutomation * pui, IUIAutomationElement * root);
BOOL button_condition_appender(IUIAutomation * pui, IUIAutomationElement * root, IUIAutomationCondition * condition);int
main(int argc, char *argv[])
{
int i;
HRESULT hr;
IUIAutomation *pui;
CoInitialize(NULL);
hr = CoCreateInstance(__uuidof(CUIAutomation), NULL, CLSCTX_INPROC_SERVER, __uuidof(IUIAutomation), (void **)&pui);
assert(hr == S_OK);
fprintf(stdout,
"Open the Task Manager to observe the memory consumed by this program. Press Enter and then open and select the calc program. You should see the Memory column increasing slowly. This program will complete in under a minute.\n");
getchar();
for (i = 0; i < 100; i++) {
HWND hwnd;
hwnd = GetTopWindow(NULL);
loop_get_buttons(pui, hwnd, 500);
}
fprintf(stdout, "Press Enter to quit.\n");
getchar();
CoUninitialize();
return 0;
}void
loop_get_buttons(IUIAutomation * pui, HWND hwnd, int iterations)
{
int i;
for (i = 0; i < iterations; i++) {
get_buttons(pui, hwnd);
}
}int
get_buttons(IUIAutomation * pui, HWND hwnd)
{
HRESULT hr;
IUIAutomationElement *root = NULL;
hr = pui->ElementFromHandle(hwnd, &root);
assert(hr == S_OK);
button_appender(pui, root);
root->Release();
return 0;
}BOOL
button_appender(IUIAutomation * pui, IUIAutomationElement * root)
{
/* Returns FALSE on success, TRUE on error. */
HRESULT hr;
VARIANT varProp;
IUIAutomationCondition *condition;
assert(root != NULL);
varProp.vt = VT_I4;
varProp.lVal = UIA_ButtonControlTypeId;
hr = pui->CreatePropertyCondition(UIA_ControlTypePropertyId, varProp, &condition);
assert(hr == S_OK && condition != NULL);
button_condition_appender(pui, root, condition);
condition->Release();
VariantClear(&varProp);
return FALSE;
}BOOL
button_condition_appender(IUIAutomation * pui, IUIAutomationElement * root,
IUIAutomationCondition * condition)
{
/* Returns FALSE on success, TRUE on error. */
HRESULT hr;
IUIAutomationElementArray *array = NULL;
assert(root);
hr = root->FindAll(TreeScope_Descendants, condition, &array); /* memory leak */
assert(hr == S_OK);
if (array)
array->Release();
return FALSE;
}
Задача ещё не решена.
Других решений пока нет …