Информация
На главную Главная

Мой t-cards.ru
Войти Войти
Зарегистрироваться Регистрация

Разное
Форум Форум
Вернуться Форумы на t-cards.ru> Hard"n"Soft
Логин
Пароль
Регистрация Участники Поиск >> FAQ


Сообщения в теме: "MSXML - утечка памяти, бага или фича микрософта..."
21.11.2007 19:32
Admin

Регистрация: 05.10.2005
Проживание: Москва
Сообщения: 272
По умолчаниюMSXML - утечка памяти, бага или фича микрософта

Заметил, что при активном юзании объекта IXMLDOMDocument утекает память и не освобождается после вызова метода Release.
Решение нашел наш пользователь Ro - надо перед вызовом метода Release вызывать

xmlDoc->loadXML(NULL,&success);

Только после этого память освобождается!!!
В инете народ с этим тоже борется, но как видно безуспешно.

Ниже код, иллюстрирующий такую картину... Если закомментировать строку, указанную выше, расставить брейкпойнтов пачку и посмотреть на объем памяти процесса, будет наглядная картина.



#pragma once
#include
#include

#import "msxml.dll"

void main(){
          CoInitialize(NULL);
          HRESULT hr;
          IXMLDOMDocument *xmlDoc;
          IXMLDOMNode *node;
          IXMLDOMElement *el;

          for (int k = 0; k < 64; k++) {
                     hr = CoCreateInstance(CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument, (void**)&xmlDoc);
                     VARIANT_BOOL success;
                     xmlDoc->loadXML(L"",&success);
                     hr = xmlDoc->selectSingleNode(L"/root", &node);
                     for (int i = 0; i < 200000; i++) {
                                hr = xmlDoc->createElement(L"test123", &el);
                                hr = node->appendChild(el, NULL);
                                el->Release();
                     }
                     node->Release();
                     xmlDoc->loadXML(NULL,&success);
                     xmlDoc->Release();
          }

          CoUninitialize();

          getchar();
          return;
}