Hi costin,
                 I think you can solve this problem by creating objects in 
proper order. For instance, first you declare global object  of dom_initialiser 
and followed by static variables declaration.
 
Regards
Raman 
> From: [EMAIL PROTECTED]> To: [EMAIL PROTECTED]> CC: [email protected]> 
> Subject: FW: calling Initialize/Terminate from a static object generates mem 
> leaks> Date: Wed, 28 May 2008 17:21:09 +0200> > Hi,> > I'm using xerces 2.7 
> on Windows XP SP3, Visual Studio 2003. Everything was> fine until I needed to 
> declare a static variable (at file scope) which, in> turn, contained 
> references to xerces objects that need xercesc_2_7> ::Initialize/ 
> xercesc_2_7::Terminate pair functions to be called first.> Thus, I had to 
> find a way to call xercesc_2_7::Initialize before entering> main function. 
> Here is my file:> > #include <xercesc/util/PlatformUtils.hpp>> > struct 
> dom_initialiser> {> dom_initialiser ()> {> 
> xercesc_2_7::XMLPlatformUtils::Initialize();> }> > ~ dom_initialiser ()> {> 
> xercesc_2_7::XMLPlatformUtils::Terminate();> }> };> > dom_initialiser t; > > 
> int main(int argc, char* argv[])> {> return 0;> }> > > > Although the program 
> is trivial, Rational Purify reports memory leaks! I> investigated to see how 
> serious the warnings/memory leaks are and I> discovered the following:> > 1. 
> xerces uses XMLRegisterCleanup to clean up some stuff. Static objects of> 
> type XMLRegisterCleanup are instantiated through xerces cpp files and> 
> XMLRegisterCleanup::registerCleanup method is afterwards called to register> 
> pointers to functions that will do the actual clean up. Internally, the> 
> class holds two pointers which serve to implement a doubly linked list,> 
> gXMLCleanupList. > > 2. XMLPlatformUtils::Terminate() (platformsutils.cpp 
> file) method iterates> over gXMLCleanupList and calls doCleanup(). > > > > 
> The problem with this approach is that some of (all) the static objects are> 
> used BEFORE their initialization! That's the reason why rational purify> 
> detects memory leaks! For instance, in file TransService.cpp the objects> > 
> static XMLRegisterCleanup mappingsCleanup;> static XMLRegisterCleanup 
> mappingsRecognizerCleanup;> > are used in the constructor 
> XMLTransService::XMLTransService() before their> initialization (lines 94, 
> 107):> > mappingsCleanup.registerCleanup(reinitMappings); // mappingsCleanup 
> not> initialized!!!!> > > I solved this by creating a new function(s):> 
> XMLRegisterCleanup & mappingsCleanup()> {> static XMLRegisterCleanup 
> mappingsCleanup;> return mappingsCleanup;> }> and calling 
> mappingsCleanup().registerCleanup(reinitMappings);> > > Question: do you 
> think guys that this approach is ok? Can you spot any> hidden issue that is 
> not so obvious? Do you think that it would be a good> idea to change all 
> static instances of XMLRegisterCleanup objects to> functions?> > > If you 
> look inside the file XMLRegisterCleanup.hpp there is a comment> saying:> > 
> "// N.B. These objects need to be statically allocated. I couldn't think> // 
> of a neat way of ensuring this - can anyone else?"> > > > That is all with 
> the static construction. Now, let's move on destruction: > > 
> xercesc_2_7::XMLPlatformUtils::Terminate() must be called last. Therefore, I> 
> isolated struct test into an hpp that is included FIRST by any project hpp> 
> that uses xerces. The files (hpp and cpp) look like this:> > > 
> ########################################dom_init.hpp#####################> > 
> #ifndef DOM_INIT_HPP> #define DOM_INIT_HPP> > class dom_initialiser> {> 
> public:> ~dom_initialiser();> dom_initialiser();> > };> > namespace > {> /**> 
> * Dummy object that forces the creation of dom_initialiser.> * This will 
> ensure that creating static or file scope> * instances of xml::str is not 
> done before the XML lib is> * properly initialised AND 
> XMLPlatformUtils::Terminate() is> called> last (after all xerce objects have 
> been destroyed) > */> > dom_initialiser __dummy__dom_initialiser__;> }> 
> #endif> > > > #########################dom_init.cpp#########################> 
> > #include "dom_init.hpp"> using namespace xercesc; > > 
> dom_initialiser::dom_initialiser()> {> XMLPlatformUtils::Initialize();> }> > 
> dom_initialiser::~dom_initialiser()> {> XMLPlatformUtils::Terminate();> }> > 
> With this approach I completely eliminated the need of explicit call to> 
> Initialize/Terminate! > > > > Please feel free to criticize. Any comments are 
> welcomed!> > > Costin. > > > 
> ---------------------------------------------------------------------> To 
> unsubscribe, e-mail: [EMAIL PROTECTED]> For additional commands, e-mail: 
> [EMAIL PROTECTED]> 
_________________________________________________________________
Catch the latest fashion shows, get beauty tips and learn more on fashion and 
lifestyle.
http://video.msn.com/?mkt=en-in

Reply via email to