Thanks Alberto, but I'm perplex now : should I call the release method on the
DOMDocument ou should I just delete it w/o calling release?
Thx man : )
Alberto Massari wrote:
>
> You shouldn't explicitly release a DOMDocument unless you adopted it
> from the DOMParser, or it will try to release it after it has already
> been deleted.
> You shouldn't also attempt to delete an object that you already released.
>
> Alberto
>
> radada ha scritto:
>> Hi there : )
>>
>> I think I'm going nuts : (
>> Thanks to Alberto, I've got a code which is approximatively good. As told
>> in
>> a previous post, I implemented a functional layer over the xerces library
>> so
>> that we can use it in our software at work.
>> In order to control as much as possible the memory leaks, I created a
>> singleton which can (and only it can) create DOMDocument and
>> XercesDOMParser. It is reponsible too for the releasing of the objets.
>>
>> So for the parser, I've got a release method :
>>
>> void XMLFactory::releaseParser(ParserXML* p_poParser)
>> {
>> #ifdef AFF
>> cout << "XMLFactory::releaseParser()" << endl;
>> #endif
>>
>>
>> // suppression en se basant sur les adresses des objets
>> for (int i=0; i<m_oListeParserXML.entries(); i++)
>> {
>> ParserXML* ptr = NULL;
>> ptr = m_oListeParserXML.at(i);
>> if (ptr == p_poParser)
>> m_oListeParserXML.removeAt(i);
>> }
>>
>> // on delete l'objet (on test avant s'il n'est pas NULL avec le
>> ThrowIfNullWithMsg)
>> DeleteIfObject(p_poParser);
>> }
>>
>> In the destructor of the Parser, I've got this :
>>
>> ParserXML::~ParserXML()
>> {
>> #ifdef AFF
>> cout << "Destructeur de ParserXML" << endl;
>> #endif
>>
>> if (m_poDocument != NULL)
>> {
>> m_poDocument->release();
>> }
>> m_poDOMParser->reset();
>>
>> DeleteIfObject(m_poDOMParser);
>> DeleteIfObject(m_poErrorHandler);
>> DeleteIfObject(m_poDOMDocument);
>> DeleteIfObject(m_poElementXML);
>> }
>>
>> Some strange things happen, especially when I compare my code to the DOM
>> Programming Guide Chapter "Constructing a XercesDOMParser"
>> (http://xerces.apache.org/xerces-c/program-dom-3.html). It seems that, to
>> delete a parser and its ressources, one only have to delete the parser.
>> If I do that, I get a core Dump while deleting the DOMDocument.
>> So I added a m_poDOMParser->resetDocumentPool(), but it had the same
>> effect.
>> Then I tried with m_poDOMParser->reset() and it did work! Well, not that
>> much. Sometimes it does, sometimes it doesn't. I still get a core Dump
>> sometimes, always when deleting the parser...
>>
>> Just for the record, here is the parsing method :
>>
>> ElementXML* ParserXML::parse(const char* p_pcBuffer)
>> {
>> #ifdef AFF
>> cout << "ParserXML::parse()" << endl;
>> #endif
>>
>> // Si aucun buffer n'est passé, on renvoie NULL
>> if (p_pcBuffer == NULL)
>> {
>> return NULL;
>> }
>>
>> // si le parser n'a pas libéré les ressources du précédent parse
>> if (m_bDocumentParsed)
>> {
>> if (m_poDocument != NULL)
>> {
>> m_poDocument->release();
>> }
>> m_poDOMParser->reset();
>> m_bDocumentParsed = false;
>> }
>>
>> char* l_pcMessage;
>> // on crée un objet pour le parsing
>> MemBufInputSource l_oInputSource((const XMLByte*)p_pcBuffer,
>> strlen(p_pcBuffer),
>> (const XMLCh*) "ParserXML");
>> try
>> {
>> // on parse
>> m_poDOMParser->parse(l_oInputSource);
>>
>> // on récupère le DOMDocument parsé
>> m_poDocument = m_poDOMParser->getDocument();
>>
>> // on libère la mémoire si besoin
>> DeleteIfObject(m_poElementXML);
>> //on crée un nouveau ElementXML avec les données du DOMDocument
>> m_poElementXML = new
>> ElementXML(m_poDocument->getDocumentElement());
>> // on indique que le Document a été correctement parsé
>> m_bDocumentParsed = true;
>> // on retourne l'ElementXML ainsi créé
>> return m_poElementXML;
>> }
>> catch(XMLException& XMLEx)
>> {
>> l_pcMessage = XMLString::transcode(XMLEx.getMessage());
>> ExceptMessage ex("T00500", "XML Exception", l_pcMessage);
>> XMLString::release(&l_pcMessage);
>> ex.doThrow();
>> }
>> catch(DOMException& DOMEx)
>> {
>> l_pcMessage = XMLString::transcode(DOMEx.msg);
>> ExceptMessage ex("T00501", "XML Exception", l_pcMessage);
>> XMLString::release(&l_pcMessage);
>> ex.doThrow();
>> }
>> catch(SAXParseException& SaxParseEx)
>> {
>> l_pcMessage = XMLString::transcode(SaxParseEx.getMessage());
>> ExceptMessage ex("T00502", "SAXParse Exception", l_pcMessage);
>> XMLString::release(&l_pcMessage);
>> ex.doThrow();
>> }
>> catch(SAXException& SaxEx)
>> {
>> l_pcMessage = XMLString::transcode(SaxEx.getMessage());
>> ExceptMessage ex("T00502", "SAX Exception", l_pcMessage);
>> XMLString::release(&l_pcMessage);
>> ex.doThrow();
>> }
>> catch(...)
>> {
>> ExceptMessage ex("T00450", " ", "Erreur inconnue");
>> ex.doThrow();
>> }
>> }
>>
>> You just can't imagine how happy will I be when I won't have to code into
>> this libraby :D
>> Anyway, as always, if you find something weird, or even the tinniest
>> clue,
>> please, post here.
>>
>> Thanks a lot.
>>
>>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>
>
--
View this message in context:
http://www.nabble.com/Core-Dump-while-releasing-Parser-ressources...-tp23560721p23565333.html
Sent from the Xerces - C - Dev mailing list archive at Nabble.com.
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]