PDA

Visualizza la versione completa : [C++] Errore di "segmentation fault" con OpenGL


Francis87
31-10-2007, 02:27
Salve a tutti

Ho un problema con widget openGL: ho un'applicazione in c++ e qt dove mi creo un widget openGL.

Nel costruttore della classe che si occupa della gui chiamo:

MyGUI::MyGUI() : QMainWindow()
{
glField = new MyGLWidget;
}

glField definito nel header come
MyGLWidget *glField;

MyGLWidget una classe derivata da QGLWidget:

#include <QtOpenGL/QGLWidget>
#include <QWidget>

class QWidget;

class MyGLWidget : public QGLWidget
{
Q_OBJECT
public:
MyGLWidget();
~MyGLWidget();
};
La classe ha vari metodi che sono ora tutti commentati perch non importanti per il problema.

La compilazione va a buon fine, ma quando lancio il programma ottengo un segmentation fault alla creazione del MyGLWidget con new.

L'errore riportato :

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x2b3474ed70a0 (LWP 5100)]
0x00002b3475683b6c in __glim_GetString () from /usr/lib/dri/fglrx_dri.so

C' speranza di risolverlo?

Il compilatore g++ 4.2.3 su Debian Linux.

oregon
31-10-2007, 07:29
Bisognerebbe vedere il codice del costruttore della MyGLWidget, ovvero il corpo della

MyGLWidget();

XWolverineX
31-10-2007, 07:36
ma segmentation fault che significa in effetti?

oregon
31-10-2007, 07:40
E' l'equivalente windows dell'accesso in memoria quando questa non poteva essere read/write.

Ovvero, e' il tentativo di accedere (in genere tramite un puntatore con un valore non corretto ...) ad un indirizzo di memoria non allocato al processo in cui sta girando quel codice ...

Francis87
31-10-2007, 21:42
Originariamente inviato da oregon
Bisognerebbe vedere il codice del costruttore della MyGLWidget, ovvero il corpo della

MyGLWidget();
non c' nulla! :'(


MyGLWidget::MyGLWidget() : QGLWidget()
{
printf("mark 2\n");
}

menphisx
01-11-2007, 14:34
Esiste il debug ...
:)

MacApp
01-11-2007, 18:46
Ho visto la dichiarazione della classe QGLWidget http://doc.trolltech.com/3.3/qgl-h.html
in cui si vede che il suo distruttore non virtuale, il che generalmente significa che NON derivabile.

EDIT: curiosamente ho visto che nella documentazione si dice di "derivarla", non mi spiego quindi per quale oscuro motivo tale distruttore non sia virtuale.. ma ok non conosco di preciso le qgl.

Francis87
01-11-2007, 19:37
mah.. mi basavo sugli esempi, come qua: http://doc.trolltech.com/4.3/opengl-2dpainting-glwidget-cpp.html

la versione di qt la 4.3 non 3.3 cmq :D

gdb mi ha riportato l'errore

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x2b3474ed70a0 (LWP 5100)]
0x00002b3475683b6c in __glim_GetString () from /usr/lib/dri/fglrx_dri.so
l'esecuzione del programma d solamente

Segmentation fault

MacApp
01-11-2007, 21:56
Ho verificato che anche nella 4.3 il distruttore della QGLWidget NON virtuale.
Molto strambo per una classe che stata creata per essere derivata. Non formalmente un errore, praticamente obbliga lo sviluppatore ad istanziare direttamente la classe derivata, senza riferivisi attraverso la super classe.
Insomma se la si utilizza come "GDerivata * aDerivata = new GDerivata;" non ci son problemi, ma se si fa "GBase * aBase = new GDerivata" allora sicuramente, il fatto che il distruttore di GBase non sia virtuale, implica che il suo distruttore non venga chiamato, con tutte le inevitabili conseguenze catastrofiche del caso. Ma ripeto non conosco le qgl.

In ogni modo per il tuo problema, usa il debugger, ed al momento del crash, osservando lo stack delle chiamate, dovresti capire, dove sta il problema.

Francis87
02-11-2007, 21:42
ho installato i pacchetti di debug per qt, ma gdb non mi d alcuna informazione in aggiunta a quanto ho postato prima. C' qualche flag particolare da impostare?

utilizzo la classe come

MyGLWidget *glField; // in MyGUI.h
glField = new MyGLWidget; // in MyGUI.cpp
quindi dovrebbe andare... ma non va.

Loading