hi Alberto indeed, now it is ok. thank you, i have not much experience with Janitor.
I have another question about Janitor or AutoDelete Template Classes, because i saw them in many examples. What are the big difference between them and when should i use these classes. greetings Affe -------- Original-Nachricht -------- > Datum: Fri, 11 Apr 2008 10:13:58 +0200 > Von: Alberto Massari <[EMAIL PROTECTED]> > An: [email protected] > Betreff: Re: MemBufFormatTarget possible bug > Affe, > the memory becomes corrupted because you create the MemBufFormatTarget > using the memory manager belonging to the DynamicContext stored in the > dynamic_context Janitor variable; but once that you exit from the > try/catch block, the context is deleted, the memory it allocated is > deleted, and the storage used by the MemBufFormatTarget is gone (it can > still contain the original data, or just pieces of it, but it could also > trigger access violations). > You should move the code that copies the result of the query into the > std::string inside the try/catch block, or move the dynamic_context out > of it. > > Alberto > > [EMAIL PROTECTED] wrote: > > hi Alberto > > > > can you please try my example again, now i have a complete copy&paste > programm, maybe i do some wrong initializing. thanks > > > > my output is always (the first character should be '<b b': > > > > length :70 > > 1n="b1"> some b1 text</b> > > <b b2n="b2"> some b2 text</b> > > > > > > > > > > #include <iostream> > > #include <vector> > > #include <map> > > > > #include <xercesc/framework/StdOutFormatTarget.hpp> > > #include <xercesc/framework/LocalFileFormatTarget.hpp> > > #include <xercesc/util/XMLUri.hpp> > > #include <xercesc/parsers/XercesDOMParser.hpp> > > #include <xercesc/framework/MemBufInputSource.hpp> > > #include <xercesc/util/OutOfMemoryException.hpp> > > #include <xercesc/framework/MemBufFormatTarget.hpp> > > > > //XQilla includes > > #include <xqilla/xqilla-simple.hpp> > > #include <xqilla/ast/LocationInfo.hpp> > > #include <xqilla/context/MessageListener.hpp> > > #include <xqilla/utils/PrintAST.hpp> > > #include <xqilla/events/EventSerializer.hpp> > > #include <xqilla/events/NSFixupFilter.hpp> > > #include <xqilla/xerces/XercesConfiguration.hpp> > > #include <xqilla/fastxdm/FastXDMConfiguration.hpp> > > #include <xqilla/utils/XQillaPlatformUtils.hpp> > > > > #if defined(XERCES_HAS_CPP_NAMESPACE) > > XERCES_CPP_NAMESPACE_USE > > #endif > > > > using namespace std; > > > > #define QUERY_BUFFER_SIZE 32 * 1024 > > #define BASEURI_BUFFER_SIZE 2 * 1024 > > > > > > int main(int argc, char *argv[]) > > { > > > > XMLPlatformUtils::Initialize(); > > XQillaPlatformUtils::initialize(); > > > > > > XercesDOMParser *parser = new XercesDOMParser(); > > parser->setValidationScheme(XercesDOMParser::Val_Auto); > > parser->setDoNamespaces(true); > > parser->setDoSchema(false); > > parser->setValidationSchemaFullChecking(false); > > parser->setCreateEntityReferenceNodes(false); > > > > > > std::string xml("\ > > <test>\ > > <b b1n='b1'> some b1 text\ > > </b>\ > > <b b2n='b2'>some b2 text\ > > </b>\ > > <a url='test.xml' name='aaaa'/>\ > > </test>\ > > "); > > > > MemBufInputSource*memBufIS = new MemBufInputSource > > ( > > (const XMLByte*)xml.c_str() > > , xml.length() > > , "somedoc" > > , false > > ); > > > > > > try > > { > > parser->parse(*memBufIS); > > } > > catch (const OutOfMemoryException&) > > { > > cout<<"OutOfMemoryException"<<endl; > > } > > catch (const XMLException& e) > > { > > cout << "XMLException" << endl; > > } > > > > catch (...) > > { > > cout << "some unnown exception" << endl; > > } > > DOMNode*root = parser->getDocument()->getFirstChild(); > > ((DOMDocument*)parser->getDocument())->setDocumentURI(0); > > > > > > XercesConfiguration xercesConf; > > XQillaConfiguration *conf = &xercesConf; > > XQilla xqilla; > > int language = XQilla::XQUERY; > > language |= XQilla::UPDATE; > > Janitor<DynamicContext> contextGuard > > (xqilla.createContext((XQilla::Language)language, conf)); > > DynamicContext *context = contextGuard.get(); > > > > context->setXPath1CompatibilityMode(false); > > MemBufFormatTarget*memtarget=0; > > > > > > try{ > > XQQuery *query = xqilla.parse( > > > > //query 1 (only corrupt when mem=1024) > > //X("declare revalidation skip;/test/b") > > > > //query 2 (always corrupt) > > X("for $i in (1 to 2)\ > > return\ > > <b>\ > > {attribute {concat('b', $i, 'n')} {concat('b',$i)}}\ > > some b{$i} text\ > > </b>") > > > > ,contextGuard.release() > > ); > > Janitor<DynamicContext> > dynamic_context(query->createDynamicContext()); > > Node::Ptr node = xercesConf.createNode(root,dynamic_context.get()); > > dynamic_context->setContextItem(node.get()); > > dynamic_context->setContextPosition(1); > > dynamic_context->setContextSize(1); > > > > > > int mem=0; > > //int mem=1024; > > memtarget = new MemBufFormatTarget(mem, > > dynamic_context->getMemoryManager()); > > EventSerializer writer("UTF-8", "1.1", memtarget, > > dynamic_context->getMemoryManager()); > > writer.addNewlines(true); > > NSFixupFilter nsfilter(&writer, dynamic_context->getMemoryManager()); > > query->execute(&nsfilter, dynamic_context.get()); > > } > > catch(XQException &e) {} > > > > int count = memtarget->getLen()*sizeof(XMLByte); > > string result((char*)memtarget->getRawBuffer(), > > count); > > cout << "length :" << count << endl; > > cout << result << endl; > > > > XMLPlatformUtils::Terminate(); > > XQillaPlatformUtils::terminate(); > > return 0; > > } > > > > > > greetings > > Affe > > > -- Ist Ihr Browser Vista-kompatibel? Jetzt die neuesten Browser-Versionen downloaden: http://www.gmx.net/de/go/browser
