Eliminazione di un puntatore condiviso
-
22-07-2019 - |
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.
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.