Domanda

Ho giocato in giro con il Xerces-C libreria XML.

ho questo semplice esempio sto giocando con.

Non riesco a farlo funzionare senza perdite di memoria e senza andare in segfault. E 'uno o l'altro.

Il segfault si verifica sempre quando elimino l'oggetto parser in "Clean up".

Ho provato con entrambi i 2.8 e 2.7 versioni della libreria.

Nota: Ho preso tutte eccezione check-out del codice, ottengo gli stessi risultati con essa e senza di essa. Per facilitare la lettura e la semplicità ho rimosso dal codice qui sotto.

persone qualsiasi Xerces-savvy là fuori si preoccupano di fare qualche suggerimento?

non posso davvero dire molto dalla traccia di nuovo, è solo saltare giù nel distruttore superclasse e va in segfault lì.

Backtrace:

(gdb) bt
#0  0x9618ae42 in __kill ()
#1  0x9618ae34 in kill$UNIX2003 ()
#2  0x961fd23a in raise ()
#3  0x96209679 in abort ()
#4  0x95c5c005 in __gnu_cxx::__verbose_terminate_handler ()
#5  0x95c5a10c in __gxx_personality_v0 ()
#6  0x95c5a14b in std::terminate ()
#7  0x95c5a6da in __cxa_pure_virtual ()
#8  0x003e923e in xercesc_2_8::AbstractDOMParser::cleanUp ()
#9  0x003ead2a in xercesc_2_8::AbstractDOMParser::~AbstractDOMParser ()
#10 0x0057022d in xercesc_2_8::XercesDOMParser::~XercesDOMParser ()
#11 0x000026c9 in main (argc=2, argv=0xbffff460) at test.C:77

Il codice:

#include <string>
#include <vector> 

#if defined(XERCES_NEW_IOSTREAMS)
#include <iostream>
#else
#include <iostream.h>
#endif

#include <xercesc/dom/DOM.hpp>
#include <xercesc/dom/DOMDocument.hpp>
#include <xercesc/dom/DOMElement.hpp>
#include <xercesc/dom/DOMImplementation.hpp>
#include <xercesc/parsers/XercesDOMParser.hpp>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/sax/HandlerBase.hpp>
#include <xercesc/util/OutOfMemoryException.hpp>
#include <xercesc/framework/MemBufInputSource.hpp>

using namespace std;

XERCES_CPP_NAMESPACE_USE

int main(int argc, char const* argv[])
{

  string skXmlMetadata = "<?xml version=\"1.0\"?>\n <xmlMetadata>b</xmlMetadata>";

  XMLPlatformUtils::Initialize();
  XercesDOMParser* xmlParser = NULL;
  DOMWriter* xmlWriter = NULL; 
  ErrorHandler* errHandler = NULL;
  const XMLByte* xmlBuf =  NULL;
  MemBufInputSource* memBufIS = NULL;
  DOMNode* xmlDoc = NULL;

  xmlParser = new XercesDOMParser();
  xmlParser->setValidationScheme( XercesDOMParser::Val_Never );
  xmlParser->setDoNamespaces( false );
  xmlParser->setDoSchema( false );
  xmlParser->setLoadExternalDTD( false );

  errHandler = (ErrorHandler*) new HandlerBase();
  xmlParser->setErrorHandler( errHandler );

  // Create buffer for current xmlMetadata
  xmlBuf = (const XMLByte*) skXmlMetadata.c_str();
  const char* bufID = "XmlMetadata";
  memBufIS = new MemBufInputSource( xmlBuf, skXmlMetadata.length(), bufID, false );

  // Parse
  xmlParser->resetErrors();
  xmlParser->parse( *memBufIS );
  xmlDoc = xmlParser->getDocument();

  // Write created xml to input SkArray
  XMLCh* metadata = NULL;
  xmlWriter = DOMImplementation::getImplementation()->createDOMWriter();
  xmlWriter->setFeature( XMLUni::fgDOMWRTFormatPrettyPrint, true );
  metadata = xmlWriter->writeToString( *xmlDoc );
  xmlWriter->release();


  // Print out our parsed document
  char* xmlMetadata = XMLString::transcode( metadata );
  string c = xmlMetadata;
  cout << c << endl;

  // Clean up
  XMLString::release( &xmlMetadata );
  xmlDoc->release();
  delete xmlParser; // Dies here
  delete memBufIS;
  delete errHandler;
  XMLPlatformUtils::Terminate();

  return 0;
}
È stato utile?

Soluzione

"xmlDoc-> rilascio ();" è il colpevole. Non avete proprio che il nodo a meno che non si dice "xmlParser-> adoptDocument ()"

http://xerces.apache.org/xerces -c / apidocs-2 / classAbstractDOMParser.html # fe052561c37d70b62ac57ab6706d75aa

Altri suggerimenti

Consente di esplorare le prove ...

#6  0x95c5a14b in std::terminate ()

Posso dirvi questo viene chiamato quando un distruttore genera un'eccezione. Distruttori generazione di eccezioni è un grande no-no. Xerces possono fare qualcosa wonky.

O potrebbe essere causato da questa linea

#7  0x95c5a6da in __cxa_pure_virtual ()

dove qualcosa potrebbe mancare in una tabella di funzione virtuale. Forse uno dei membri distruttore dell'oggetto DOM? Forse questo genera un'eccezione?

Questo link offre una grande spiegazione su ciò che potrebbe causare le ricerche tabella virtuale a fallire. In breve, può essere causato da un puntatore penzoloni classe base in giro qualcuno che cerca di effettuare una chiamata di funzione polimorfica su quel puntatore.

Esempio data dal link qui sopra:

// From sample program 5:
AbstractShape* p1 = new Rectangle(width, height, valuePerSquareUnit);
std::cout << "value = " << p1->value() << std::endl;
AbstractShape* p2 = p1;  // Need another copy of the pointer.
delete p1;
std::cout << "now value = " << p2->value() << std::endl;

A proposito di puntatori penzolanti, sembra che il XercesDomParser sta tenendo oggetti newed:

  errHandler = (ErrorHandler*) new HandlerBase();
  xmlParser->setErrorHandler( errHandler )

ma poi cancellato / rilasciato

  // Clean up
  XMLString::release( &xmlMetadata );
  xmlDoc->release();
  delete xmlParser;
  delete memBufIS;
  delete errHandler;

Potrebbe dell'ordine si stanno distruggendo le cose siano errati e causare alcuni dei problemi di cui sopra? Sulla faccia di esso, le cose sembrano OK, ma è lì che vorrei sperimentare e fare doppio controllare la documentazione su come le cose dovrebbero essere abbattute.

Non riesco a vedere nulla di sbagliato, ovviamente, con il codice. Come si potrebbe provare a rimuovere tutti gli usi di nuovo e cancellare il codice e creare le Cerces oggetti si utilizza come base di objectys pila invece. Ad esempio, invece di:

xmlParser = new XercesDOMParser();

utilizzo:

XercesDOMParser xmlParser;

e così via.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top