[Jde-dev] Problema "Segmentation fault" accediendo a método de objeto, atributo de una clase

David Lobato dav.lobato en gmail.com
Lun Jun 7 18:42:32 CEST 2010


Hola,

Si eso es un copy&paste de tu código, yo diría que lo que pasa es que estás
re-declarando el objeto en el ámbito del constructor:

introrob::introrobcanvas * canvas = new introrob::introrobcanvas();

Cuando lo que deberías estar haciendo es inicializar el miembro de la clase
*canvas *bien en la zona de inicialización con:

Introrob::Introrob() //<- ignoro si la clase se llama así, es un ejemplo
: canvas(new  introrob::introrobcanvas()) {
...
}

o bien dentro del código del constructor con:

...
this->canvas = new introrob::introrobcanvas(); //this-> es opcional
...


Por último te recomiendo que uses la clase
RefPtr<http://library.gnome.org/devel/glibmm/unstable/classGlib_1_1RefPtr.html>
para
manejar punteros, de modo que no tengas que preocuparte por la gestión de
memoria.

Espero haberte ayudado,
David.


2010/6/7 Javier Vazquez <javiervazper en yahoo.es>

> Hola a todos,
>
> solicito un poco de ayuda con este problema que me está comiendo las tardes
> enteras sin progreso. Confío en que sea fácil de ver para los que tenéis
> sobrada experiencia programando en C++.
>
> Contexto del problema:
> Estoy implementando ahora el componente introrob de la 5.0. Existe una
> clase "introrobgui" para el control de la interfaz gráfica que maneja la
> aplicación (utilizo también glade para modelar dicha interfaz).
>
> He definido una clase heredada de Gnome::Canvas::Canvas, denominada
> "introrobcanvas", para la representación de los elementos grid, robot,
> laser, etc, sobre el área canvas de la ventana. introrobgui delega en
> introrobcanvas, esta parte de la funcionalidad.
>
> En el código de la clase introrobgui, declaro un atributo objeto de la
> clase introrobcanvas como:
>
>     introrob::introrobcanvas * canvas;
>
> Posteriormente lo instancio en el constructor de introrobgui como:
>
>     introrob::introrobcanvas * canvas = new introrob::introrobcanvas();
>
> Hasta aquí, todo bien. Adicionalmente, desde el constructor, puedo invocar
> a métodos heredados o nuevos propios del objeto "canvas", tales como :
>
>     canvas->set_center_scroll_region(false);
>     canvas->test(-9000,-9000);
>     vscale1->set_value(canvas->get_pixels_per_unit()*100);
>
> El problema lo encuentro cuando desde un método distinto al contructor de
> introrobgui, realizo la llamada a cualquiera de estos métodos de canvas. Ahí
> se produce un fallo  de segmentación. Es decir, lo siguiente me falla:
>
>     bool introrobgui::on_change_value_vscale1(Gtk::ScrollType scroll,
> double new_value)
>     {
>         printf("vscale1=%.2f\n",new_value/100);
>         canvas->set_pixels_per_unit(0.1);
>     }
>
>
>
> Disculpad mi ignorancia si la respuesta es trivial.
>
> Gracias de antemano,
> Javier.
>
>
>
>
> _______________________________________________
> Jde-developers mailing list
> Jde-developers en gsyc.es
> http://gsyc.escet.urjc.es/cgi-bin/mailman/listinfo/jde-developers
>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://gsyc.escet.urjc.es/pipermail/jde-developers/attachments/20100607/b3b6df40/attachment.htm 


More information about the Jde-developers mailing list