Pregunta

Tengo algunos fallos de segmentación intermitentes en una aplicación Qt. Creo que el problema está relacionado con nuestra (mal) uso de QSharedPointer. El Qt estados de documentación :

QSharedPointer :: QSharedPointer (T * ptr): Crea un QSharedPointer que los puntos de PTR. El puntero PTR queda gestionada por esta QSharedPointer y no debe ser pasado a otro objeto QSharedPointer o borra fuera de este objeto .

creo que estamos haciendo tanto no debe ...: /

¿Hay una manera de hacer cumplir la POO que el puntero administrado por QSharedPointer no puede ser eliminado o se pasa a otro QSharedPointer?

La mejor solución será tener un error de compilación.

¿Fue útil?

Solución

El patrón normal es poner la declaración new dentro constructor del puntero inteligente, así:

QSharedPointer<Obj> p (new Obj(2)); 

De esta manera nunca se tiene una referencia al propio puntero desnudo.

Si refactorizar su código para que todo nuevo operador se encuentran en líneas como éstas, serán resueltos todos sus problemas.

Otros consejos

Bueno, una forma POO-esque sería crear el puntero del crudo como un miembro privado en una clase contenedora, y sólo realizar acciones en el puntero a través de métodos que actúan sobre el puntero compartido. tipo de pensamiento tonto, ¿no es así?

O usted podría hacer su clase con el puntero sin una clase base a sus otras clases y hacer que el puntero sin un miembro privado de la clase. En este sentido, es más o menos la creación de una clase abstracta que no hace nada. Sus clases de derivados vez deben hacer todo el trabajo, y puesto que no pueden acceder al puntero del crudo, se producirá un error de compilación ... esto no impide que alguien de simplemente copiar el valor del puntero prima del puntero compartida, sin embargo.

Al final, creo que la mejor política es Manuall cambiar todas las funciones de que se trate, ya sea con el uso de un puntero compartida o bien un puntero prima. Puede copiar un puntero compartida a otro con seguridad, ¿por qué no sólo tiene que ir de esa manera?

Editar: Debo añadir que, independientemente de si está o no está utilizando punteros compartidos, parece que usted está teniendo problemas de propiedad. Si un puntero fue creado en un ámbito, debe suprimirse en ese ámbito, a menos que la función que se pasa a contrato toma posesión del puntero. El uso de un puntero compartida En este caso sólo habrá causado diferentes insectos, con el tiempo. Parece que usted tiene problemas de diseño más profundo que sólo el intercambio de punteros.

No estoy familiarizado con la implementación particular Qt de un puntero compartida, sino como una guía general: intentar mezclar punteros con punteros primas gestionadas por lo general termina en la sangre. Una vez que la 'confianza' de una aplicación compartida puntero en la apropiación de sus datos asignados dinámicamente, debe en ningún caso tratar de gestionar la duración del objeto mismo (por ejemplo, eliminando el puntero proporcionado).

¿Hay una manera de hacer cumplir la POO que el puntero administrado por QSharedPointer no se puede eliminar?

Creo que se puede imaginar alguna técnica raro donde el tipo de puntas tendría un destructor privada y declarar QSharedPointer como amigo (lo que impediría efectivamente cualquier 'eliminación fuera' de la compilación), pero yo no apostaría que nada bueno puede salir fuera de este (y nota que va a hacer que su tipo absolutamente inservible a menos new'ed y transferido a un QSharedPointer).

¿Hay una manera de hacer cumplir la POO que el puntero administrado por QSharedPointer no se puede pasar a otro QSharedPointer?

No se me ocurre ninguna, y que es otra de las razones por las que debe evitar manipular el puntero prima una vez que se ha transferido la propiedad a un QSharedPointer.

Consulte el código de todo el uso .data () y asegúrese de que lo que se vuelven guardadas ni eliminado. No creo que un error del compilador duro sería bueno, porque a veces está bien para pasar el puntero del crudo, por ejemplo, a una función que no almacena ni borrar punteros pasados. (Especialmente cuando se utiliza código de 3 ª parte, no siempre se puede cambiar todo para utilizar punteros compartidos, y la frecuencia con la que desea que funcione con ambos PAD, primas y compartidas). Se podría marcar QSharedPointer :: datos () como obsoleta (mediante parches Qt), para obtener una advertencia de tiempo de compilación.

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