Admin
Регистрация: 05.10.2005
Проживание: Москва
Сообщения: 284
|
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;
}
|