This may be related to Bug #812 in Bugzilla
(http://nagoya.apache.org/bugzilla/show_bug.cgi?id=812) which is now fixed in
the latest nightly build http://xml.apache.org/dist/xerces-c/nightly/.

Tinny

Andrew Snare wrote:

> [apologies if this is a duplicate, my original submission seems to have
> gone missing]
>
> Hi All,
>
> I've encountered what appears to be a memory leak when DOMParser::parse()
> is invoked under some circumstances. This occurs when linking against a
> static version of Xerces-C 1.4 built using Borland C/C++ 5.5.1 (SP2) +
> STLPort. Experimentation has shown that each call to parse() leaks 128KB of
> memory -- quite a lot, especially considering our application needs to
> invoke parse() thousands of times per second. The smallest program which
> demonstrates the problem for us is:
>
> #include <iostream>
> #include <util/PlatformUtils.hpp>
> #include <parsers/DOMParser.hpp>
>
> int main(int argc, char *argv[])
> {
>         if(argv[1])
>         {
>                 XMLPlatformUtils::Initialize();
>                 DOMParser *parser = new DOMParser;
>                 parser->setValidationScheme(DOMParser::Val_Never);
>                 try
>                 {
>                         parser->parse(argv[1]);
>                 }
>                 catch(...)
>                 {
>                         std::cerr << "Warning: XML errors encountered."
>                                 << std::endl;
>                 }
>                 delete parser;
>                 XMLPlatformUtils::Terminate();
>         }
>         else
>                 std::cout << "No filename given." << std::endl;
>         return 0;
> }
>
> The leak is observed with the following input:
> <?xml version="1.0"?>
> <!DOCTYPE group SYSTEM "project-team.dtd">
> <group name="department">
>         <team name="project">
>         <person name="A" leader="true"/>
>         <person name="B"/>
>         <person name="C"/>
>         <person name="D"/>
>         </team>
> </group>
> and the referred DTD being:
> <!-- DTD for our sample xml stuff -->
> <!ELEMENT group (team*) >
> <!ATTLIST group name CDATA #REQUIRED >
> <!ELEMENT team (person*) >
> <!ATTLIST team name CDATA #REQUIRED >
> <!ELEMENT person EMPTY >
> <!ATTLIST person name CDATA #REQUIRED >
> <!ATTLIST person leader CDATA "false" >
>
> However, if we remove the <!DOCTYPE> line, then no memory leak is observed
> with:
> <?xml version="1.0"?>
> <group name="department">
>         <team name="project">
>         <person name="A" leader="true"/>
>         <person name="B"/>
>         <person name="C"/>
>         <person name="D"/>
>         </team>
> </group>
>
> According to a memory-leak detection tool (memproof), the leaked resources
> are:
>
>   338 Virtual
> Memory $02210000 4096 VirtualAlloc(02210000,4096,4096,4)
>   $0005C566 C:\EI\leaky.exe
>   $0005D0F3 C:\EI\leaky.exe
>   $0005CF13 C:\EI\leaky.exe
>   $0005C674 C:\EI\leaky.exe
>   $0005BF85 C:\EI\leaky.exe
>   $000149D4 createReader in ReaderMgr.cpp (445) C:\EI\leaky.exe
>   $0001F00A @XMLScanner@scanReset in XMLScanner2.cpp (784) C:\EI\leaky.exe
>   $0001949D scanDocument in XMLScanner.cpp (274) C:\EI\leaky.exe
>   $000193C8 scanDocument in XMLScanner.cpp (240) C:\EI\leaky.exe
>   $00019437 scanDocument in XMLScanner.cpp (249) C:\EI\leaky.exe
>   $00022BE5 parse in DOMParser.cpp (294) C:\EI\leaky.exe
>   $0000024B main in leaky.cc (14) C:\EI\leaky.exe
>   $00064E69 C:\EI\leaky.exe
>   339 Virtual
> Memory $02211000 4096 VirtualAlloc(02211000,4096,4096,4)
> [same call-stack]
>   340 Virtual
> Memory $02212000 4096 VirtualAlloc(02212000,4096,4096,4)
> [same call-stack]
>   341 Virtual
> Memory $02213000 4096 VirtualAlloc(02213000,4096,4096,4)
> [same call-stack]
>   342 Virtual
> Memory $02214000 4096 VirtualAlloc(02214000,4096,4096,4)
> [same call-stack]
>   343 Virtual
> Memory $02215000 4096 VirtualAlloc(02215000,4096,4096,4)
> [same call-stack]
>   344 Virtual
> Memory $02216000 4096 VirtualAlloc(02216000,4096,4096,4)
> [same call-stack]
>   345 Virtual
> Memory $02217000 4096 VirtualAlloc(02217000,4096,4096,4)
> [same call-stack]
>   346 Virtual
> Memory $02218000 4096 VirtualAlloc(02218000,4096,4096,4)
> [same call-stack]
>   347 Virtual
> Memory $02219000 4096 VirtualAlloc(02219000,4096,4096,4)
> [same call-stack]
>   348 Virtual
> Memory $0221A000 4096 VirtualAlloc(0221A000,4096,4096,4)
> [same call-stack]
>   349 Virtual
> Memory $0221B000 4096 VirtualAlloc(0221B000,4096,4096,4)
> [same call-stack]
>   350 Virtual
> Memory $0221C000 4096 VirtualAlloc(0221C000,4096,4096,4)
> [same call-stack]
>   351 Virtual
> Memory $0221D000 4096 VirtualAlloc(0221D000,4096,4096,4)
> [same call-stack]
>   352 Virtual
> Memory $0221E000 4096 VirtualAlloc(0221E000,4096,4096,4)
> [same call-stack]
>   353 Virtual
> Memory $0221F000 4096 VirtualAlloc(0221F000,4096,4096,4)
> [same call-stack]
>   354 Virtual
> Memory $02220000 4096 VirtualAlloc(02220000,4096,4096,4)
> [same call-stack]
>   355 Virtual
> Memory $02221000 4096 VirtualAlloc(02221000,4096,4096,4)
> [same call-stack]
>   356 Virtual
> Memory $02222000 4096 VirtualAlloc(02222000,4096,4096,4)
> [same call-stack]
>   357 Virtual
> Memory $02223000 4096 VirtualAlloc(02223000,4096,4096,4)
> [same call-stack]
>   358 Virtual
> Memory $02224000 4096 VirtualAlloc(02224000,4096,4096,4)
> [same call-stack]
>   359 Virtual
> Memory $02225000 4096 VirtualAlloc(02225000,4096,4096,4)
> [same call-stack]
>   360 Virtual
> Memory $02226000 4096 VirtualAlloc(02226000,4096,4096,4)
> [same call-stack]
>   361 Virtual
> Memory $02227000 4096 VirtualAlloc(02227000,4096,4096,4)
> [same call-stack]
>   362 Virtual
> Memory $02228000 4096 VirtualAlloc(02228000,4096,4096,4)
> [same call-stack]
>   363 Virtual
> Memory $02229000 4096 VirtualAlloc(02229000,4096,4096,4)
> [same call-stack]
>   364 Virtual
> Memory $0222A000 4096 VirtualAlloc(0222A000,4096,4096,4)
> [same call-stack]
>   365 Virtual
> Memory $0222B000 4096 VirtualAlloc(0222B000,4096,4096,4)
> [same call-stack]
>   366 Virtual
> Memory $0222C000 4096 VirtualAlloc(0222C000,4096,4096,4)
> [same call-stack]
>   367 Virtual
> Memory $0222D000 4096 VirtualAlloc(0222D000,4096,4096,4)
> [same call-stack]
>   368 Virtual
> Memory $0222E000 4096 VirtualAlloc(0222E000,4096,4096,4)
> [same call-stack]
>   369 Virtual
> Memory $0222F000 4096 VirtualAlloc(0222F000,4096,4096,4)
>
> The call-stack given corresponds to a new XMLReader instance being
> allocated on the heap. It would appear, from debugging statements I
> inserted into the library, that every constructor call is matched by a
> destructor call and all dynamically allocated data members of this class
> appear to be cleaned-up correctly by the destructor.
>
> I haven't been able to confirm if the same problem exists under Xerces-C
> 1.5 due to the lengthy process involved in compiling Xerces-C under Borland
> C/C++ 5.5.1. However at this point I'm pretty-much stuck and would
> appreciate any comments people might have on where the problem might be and
> how to proceed from here.
>
> Thanks in advance,
>
>   - Andrew
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to