Утечки памяти при динамическом создание ActiveX в ATL
От: dr_begemot Россия  
Дата: 06.04.10 05:59
Оценка:
Проблема в следующем, есть некоторое приложение на 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
От: rus blood Россия  
Дата: 06.04.10 08:10
Оценка:
Здравствуйте, dr_begemot, Вы писали:

_>Может я как-то не до конца удаляю контролл?


Да вроде все верно.
Проверь утечки в самом контроле...
Имею скафандр — готов путешествовать!
Re: Утечки памяти при динамическом создание ActiveX в ATL
От: okman Беларусь https://searchinform.ru/
Дата: 06.04.10 08:29
Оценка:
Здравствуйте, dr_begemot.

Могу только посоветовать — подключите журналирование и поймайте место или регион, где происходит утечка.
Re[2]: Утечки памяти при динамическом создание ActiveX в ATL
От: dr_begemot Россия  
Дата: 06.04.10 08:53
Оценка:
Здравствуйте, okman, Вы писали:

O>Здравствуйте, dr_begemot.


O>Могу только посоветовать — подключите журналирование и поймайте место или регион, где происходит утечка.


А как подключить журналирование?
Re[3]: Утечки памяти при динамическом создание ActiveX в ATL
От: okman Беларусь https://searchinform.ru/
Дата: 06.04.10 09:31
Оценка:
Здравствуйте, dr_begemot, Вы писали:

>А как подключить журналирование?


Ну Вы же используете Log, trace или что-то в этом роде ?
Re: Утечки памяти при динамическом создание ActiveX в ATL
От: algol Россия about:blank
Дата: 06.04.10 13:57
Оценка:
Здравствуйте, dr_begemot, Вы писали:

_>Так вот, если добавить контролл, а потом удалить его, и призвести эту операцию несколько раз, то память будет увеличиваться примерно на 200кб за каждую итерацию.


Похоже, что это ваш случай: PRB: CAxWindow Members Can Cause a Memory Leak

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
От: dr_begemot Россия  
Дата: 07.04.10 07:58
Оценка:
Здравствуйте, 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.


Действительно, очень похоже...
Сделал по одному из вариантов, написанных в этой статье:
http://support.microsoft.com/kb/218442/EN-US/

Т.е. так:
Добавление контролла:
    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--;
    }


Теперь не то чтобы утечки памяти, но при удалении контролла память вообще не освобождается....
Я видимо что-то забыл удалить?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.