Domanda

Ho un puntatore a un QScriptEngine che sto passando attraverso il costruttore di classe sovraccarico della classe Evaluator e lo assegno a QScriptEngine * engine _ (classe Proprietà sottoclasse Evaluator e chiama questo costruttore di Evaluator , passandogli un QScriptEngine già assegnato. Il costruttore senza argomenti crea il nuovo puntatore QScriptEngine (la classe Generic subclasse Evaluator in questo modo). Nel distruttore collaudo se engine_ non è NULL , elimino il puntatore, quindi lo assegno NULL . Il puntatore ( engine_ ) nella Proprietà ora deve essere anche NULL ? Qualcosa mi dice che non è così. In caso contrario, come gestisci questa situazione? Ho bisogno che QScriptEngine sia la stessa istanza in tutto. L'operatore = QScriptEngine è privato o eviterei il puntatore tutti insieme.

Ho visto alcune informazioni sui puntatori condivisi ( boost :: shared_ptr e std: tr1 :: shared_ptr ) in un'altra domanda SO. Sto già usando boost per la libreria regex, quindi boost non è fuori discussione se questo è il modo migliore per gestirlo. Speriamo che ci sia un modo non boost, per la conoscenza generale del C ++ e progetti futuri.

È stato utile?

Soluzione

Puoi risolverlo dando a una delle classi (classe A) il controllo della durata di quel puntatore, insieme a un metodo 'getter'. L'altra classe (classe B) chiamerebbe sempre il getter di A ogni volta che ha bisogno del puntatore. In questo modo, A rimane sempre in controllo del puntatore. L'aspetto negativo è la funzione getter (probabilmente sarà in linea, ma è ancora una seconda indiretta). Inoltre, B dovrà controllare quel puntatore per NULL praticamente su ogni uso.

L'altra scelta è quella di avvolgere il puntatore in qualcosa di simile a boost :: shared_ptr che si occupa del problema (se usato correttamente) tenendo il puntatore sottostante e cancellandolo solo quando tutti gli oggetti che condividono quel puntatore vengono eliminati. Puoi scriverlo tu stesso, ma dato che hai già una spinta in gioco, userò solo la loro implementazione.

Una terza scelta è quella di ricodificare il tutto in modo da non aver bisogno di un puntatore condiviso. Personalmente non progetterei mai un programma C ++ che necessitasse di puntatori condivisi, solo perché è un punto in cui i bug di gestione della memoria potrebbero facilmente insinuarsi negli anni, ma sono solo io.

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