Проблема в следующем, есть некоторое приложение на ATL, которое имеет две кнопки + и -, при нажатии на + на форму добавляется ActiveX контролл, при нажатии на — удаляется последний добавленный.
Так вот, если добавить контролл, а потом удалить его, и призвести эту операцию несколько раз, то память будет увеличиваться примерно на 200кб за каждую итерацию.
Может я как-то не до конца удаляю контролл?
Вот код добавления и удаления контроллов.
Добавление:
HRESULT hr = S_OK;
//Добавление контейнера и соответствующего объекта
CRect rcClient;
//Определяем место, где должен находится объект Plot
GetClientRect(&rcClient);
//Создаем контейнер-окно для нового объета
if(lenContainers>=GTM_MAX_ARR)
return S_OK;
lenContainers++;
Containers[lenContainers-1] = new CAxWindow();
Containers[lenContainers-1]->Create(m_hWnd, rcClient, _T(""), WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN);
//Создаем Active-X объект
try
{
hr = Containers[lenContainers-1]->CreateControl(L"axplotter.AxPlotter.1");
}
catch(...)
{
MessageBox(L"Error");
return !S_OK;
}
Удаление:
if(lenContainers){
//Удаляем контейнер и соответствующий объект
Containers[lenContainers-1]->DestroyWindow();
delete Containers[lenContainers-1];
//Зануляем последний указатель в массиве
Containers[lenContainers-1] = NULL;
//Уменьшаем колличество объектов в массиве на еденицу
lenContainers--;
}
CAxWindow *Containers[GTM_MAX_ARR]; — массив объектов
int lenContainers; — счетчик инициализированных объектов
Re: Утечки памяти при динамическом создание ActiveX в ATL
Здравствуйте, okman, Вы писали:
O>Здравствуйте, dr_begemot.
O>Могу только посоветовать — подключите журналирование и поймайте место или регион, где происходит утечка.
А как подключить журналирование?
Re[3]: Утечки памяти при динамическом создание ActiveX в ATL
Здравствуйте, dr_begemot, Вы писали:
_>Так вот, если добавить контролл, а потом удалить его, и призвести эту операцию несколько раз, то память будет увеличиваться примерно на 200кб за каждую итерацию.
the calls to Create() results in the creation of a CAxHostWindow object. The call to CreateControl() or AttachControl() also creates another CAxHostWindow Object. Upon destruction, the CAxHostWindow object created by Create() is freed.
Re[2]: Утечки памяти при динамическом создание ActiveX в ATL
Здравствуйте, algol, Вы писали:
A>Здравствуйте, dr_begemot, Вы писали:
_>>Так вот, если добавить контролл, а потом удалить его, и призвести эту операцию несколько раз, то память будет увеличиваться примерно на 200кб за каждую итерацию.
A>Похоже, что это ваш случай: PRB: CAxWindow Members Can Cause a Memory Leak
A>
A>the calls to Create() results in the creation of a CAxHostWindow object. The call to CreateControl() or AttachControl() also creates another CAxHostWindow Object. Upon destruction, the CAxHostWindow object created by Create() is freed.
HRESULT hr = S_OK;
//Добавление контейнера и соответствующего объекта
CRect rcClient;
//Определяем место, где должен находится объект Plot
GetClientRect(&rcClient);
//Создаем контейнер-окно для нового объета
if(lenContainers>=GTM_MAX_ARR)
return S_OK;
lenContainers++;
//Создаем окно для контролла
Containers[lenContainers-1] = new CAxWindow();
Containers[lenContainers-1]->Create(m_hWnd, rcClient, _T(""), WS_VISIBLE|WS_CHILD);//WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN);
//Создаем контролл
CLSID clsid;
LPUNKNOWN pUnkCtrl, pUnkCont;
hr = CLSIDFromProgID(OLESTR("axplotter.AxPlotter.1"), &clsid);
hr = CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_IUnknown, (void**)&pUnkCtrl);
CComQIPtr <IPersistStreamInit> spPerStm(pUnkCtrl);
spPerStm->InitNew();
//Добавляем контролл на окно
Containers[lenContainers-1]->AttachControl(pUnkCtrl, &pUnkCont);
Однако, удаление контроллла не изменял, т.е. оно осталось как и прежде:
if(lenContainers){
//Удаляем контейнер и соответствующий объект
Containers[lenContainers-1]->DestroyWindow();
delete Containers[lenContainers-1];
//Зануляем последний указатель в массиве
Containers[lenContainers-1] = NULL;
//Уменьшаем колличество объектов в массиве на еденицу
lenContainers--;
}
Теперь не то чтобы утечки памяти, но при удалении контролла память вообще не освобождается....
Я видимо что-то забыл удалить?