Pregunta

Tengo un puntero a un QScriptEngine que paso a través del constructor de clase sobrecargado de la clase Evaluator y lo asigna al QScriptEngine * engine _ (clase Propiedad subclases Evaluator , y llama a este constructor de Evaluator , pasándole un QScriptEngine ya asignado. El constructor sin argumentos crea el nuevo puntero QScriptEngine (clase Generic subclases Evaluator de esta manera). En el destructor pruebo si engine_ no es NULL , elimino el puntero y luego le asigno NULL . ¿El puntero ( engine_ ) en la Propiedad derivada ahora también debe ser NULL ? Algo me dice que este no es el caso. Si no, ¿cómo manejas esta situación? Necesito que QScriptEngine sea la misma instancia en todo momento. El QScriptEngine 's = operador es privado, o estaría evitando el puntero por completo.

Vi información sobre punteros compartidos ( boost :: shared_ptr y std: tr1 :: shared_ptr ) en otra pregunta de SO. Ya estoy usando boost para la biblioteca de expresiones regulares, por lo que boost no está fuera de discusión si esa es la mejor manera de lidiar con esto. Esperemos que haya una forma sin impulso, para el conocimiento general de C ++ y proyectos futuros.

¿Fue útil?

Solución

Puede resolver esto dando a una de las clases (clase A) el control de por vida de ese puntero, junto con un método 'getter'. La otra clase (clase B) siempre llamaría al captador de A siempre que necesitara el puntero. De esa manera, A permanece en control del puntero en todo momento. La desventaja es la función getter (probablemente estará en línea, pero sigue siendo una segunda indirección). Además, B tendrá que verificar ese puntero para NULL en casi todos los usos.

Su otra opción es envolver el puntero en algo como boost :: shared_ptr que soluciona el problema (si se usa correctamente) manteniendo presionado el puntero subyacente y solo eliminándolo cuando se eliminan todos los objetos que comparten ese puntero. Podrías escribir esto tú mismo, pero como ya tienes impulso en juego, simplemente usaría su implementación.

Una tercera opción es refactorizar todo para que no necesite un puntero compartido. Personalmente, nunca diseñaría un programa C ++ que necesitara punteros compartidos, solo porque es un lugar donde los errores de administración de memoria podrían aparecer fácilmente a lo largo de los años, pero ese soy yo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top