Hello!
I have simple program which reuses created document with different elements
that seems to be leaking. To demonstrate the problem I create new
DOMElement, add it to document, then immediately remove it and release. I
do it for rather big number of times.
Here is the code snippet:
#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/util/XMLString.hpp>
#include <iostream>
#include <fstream>
#include <zconf.h>
void process_mem_usage() {
double vm = 0.;
double rss = 0.;
unsigned long vsize;
long lrss;
{
std::string ignore;
std::ifstream ifs("/proc/self/stat", std::ios_base::in);
ifs >> ignore >> ignore >> ignore >> ignore >> ignore >> ignore >> ignore
>> ignore >> ignore >> ignore
>> ignore >> ignore >> ignore >> ignore >> ignore >> ignore >> ignore >>
ignore >> ignore >> ignore
>> ignore >> ignore >> vsize >> lrss;
}
long page_size_kb = sysconf(_SC_PAGE_SIZE) / 1024;
vm = vsize / 1024.;
rss = lrss * page_size_kb;
std::cout << "VM: " << vm << "; RSS: " << rss << " (Kb)" << std::endl;
}
int main() {
using namespace xercesc_3_2;
XMLPlatformUtils::Initialize();
XMLCh * const tempStr = new XMLCh[100];
XMLString::transcode("Range", tempStr, 99);
DOMImplementation *impl =
DOMImplementationRegistry::getDOMImplementation(tempStr);
XMLString::transcode("root", tempStr, 99);
DOMDocument *doc = impl->createDocument(nullptr, tempStr, nullptr);
DOMElement *root = doc->getDocumentElement();
process_mem_usage();
for(auto i = 0; i < 100; ++i) {
for(auto j = 0; j < 1000; ++j) {
XMLString::transcode("FirstElement", tempStr, 99);
DOMElement *el = doc->createElement(tempStr);
root->appendChild(el);
auto removed = (DOMElement *) root->removeChild(el);
removed->release();
}
process_mem_usage();
}
doc->release();
process_mem_usage();
delete[] tempStr;
process_mem_usage();
XMLPlatformUtils::Terminate()
return 0;
}
So I expect RSS to be unchanged or quite stable, but it rises continuously.
--
*Kind regards,*
* Alexander.*