Domanda

Sono nuovo di puntatori condivisi e chiedevo come inizializzare un puntatore condiviso se è anche una variabile membro?

Al momento il mio codice simile a questa: Nel file di intestazione, ho:

class Parser {
   public:
      Parser();
      ~Parser();

      boost::shared_ptr<XercesDOMParser> parser;
{

Nel costruttore, ho qualcosa di simile a questo:

Parser::Parser() 
{
   try {
      XMLPlatformUtils::Initialize(); 
   } catch (...) {}

   parser = shared_ptr<XercesDOMParser> (new XercesDomParser()); 
}

Nel distruttore che ho:

Parser::~Parser() {
   try {
      XMLPlatformUtils::Terminate();
   }catch(...) {}
}

Tuttavia la compilazione del programma con Valgrind, mi avrebbe ricevuto il seguente errore: metodo virtuale puro chiamato. Chiuso senza eccezione attivo. Non valido letto di dimensioni 8.

Qualsiasi intuizioni in quello che può essere fatto in modo non corretto con l'inizializzazione?

Il mio sospetto è che sto leggendo dalla memoria non allocato.

EDIT:

Quindi, nel distruttore, ho aggiunto le seguenti righe di codice prima della sospendere perdite di comando e la memoria e gli errori di tutti scomparsi!

if (parser)     parser.reset ();

Perché ogni riferimento al parser devono essere andato prima che possa essere deallocata?

Molto apprezzato, grazie.

È stato utile?

Soluzione

XMLPlatformUtils

che si sta chiamando :: terminate () prima di chiamare il distruttore per XercesDomParser. Distruttori per le variabili membro sono chiamate dopo l'esecuzione del corpo distruttore. variabili membro sono costruiti in ordine di dichiarazione, e distrutti in senso inverso.

Si potrebbe fare qualcosa di simile:

class Parser : boost::noncopyable {
    struct XmlHandle {
        XmlHandle() { XMLPlatformUtils::Initialize(); }
        ~XmlHandle() { XMLPlatformUtils::Terminate(); }
    };

    XmlHandle m_handle;
    boost::shared_ptr<XercesDOMParser> m_parser;

public:
    Parser() : m_parser(new XercesDomParser) { }
};

E basta usare il distruttore di default. Se si desidera che i costruttori di copia e operatori di assegnamento è necessario fare con questo.

Oh, e la cattura e gettando via eccezioni è probabilmente una cattiva idea ...

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