2011-01-09 12 views
0

I folgende Struktur haben:[C] Dynamische Zuordnung von Speicher-Struktur, bezogen auf GTK

typedef struct 
{ 
GtkWidget* PoziomaLinijka; 
GtkWidget* PionowaLinijka; 
GtkWidget* Label1; 
GtkWidget* Label2; 
gint x,y; 
} StrukturaDrawing; 

und ich brauche es auf dem Heap zu reservieren, da ich später Funktionen haben, die diese Struktur verwendet und ich weiß nicht möchte globale Variablen verwenden. Also habe ich es wie folgt vergeben:

StrukturaDrawing* Wsk; 
    Wsk = (StrukturaDrawing*)malloc(sizeof(StrukturaDrawing)); 
    if (!Wsk) 
    { 
printf("Error\n"); 
    } 

Und es spielt keine Fehler zurückgegeben und arbeitet auch hervorragend mit anderen Funktionen, funktioniert es so, wie ich es wollte, so endlich arbeiten, ich wollte, dass der Speicher freizugeben und hier ist Problem weil im Debug-Modus Compilator Hündinnen:

First-Chance-Ausnahme bei 0x102d12b4 in GTK.exe: 0xC0000005: Zugriffsverletzung Leseort 0xfffffffc. Nicht behandelte Ausnahme bei 0x102d12b4 in GTK.exe: 0xC0000005: Zugriffsverletzung beim Lesen der Position 0xfffffffc.

Ich verbinde Rückruf an meine Funktion, wie folgt aus:

g_signal_connect(G_OBJECT(Okno), "destroy", G_CALLBACK(Wyjscie), Wsk);

Funktion, die es annehmen, um Speicher und in der Nähe Programm zu befreien:

void Wyjscie(GtkWindow* window, GdkEvent* event, StrukturaDrawing* data) 
{ 
gtk_main_quit(); 
free(data); 
data = NULL; 
} 

Jede Hilfe wirklich zu schätzen.

Antwort

0

Nun durning Debug-Datenstruktur haben folgende Werte: Der erste Teil hat: PoziomaLinijka CXX0017: Fehler: Symbol „“ nicht gefunden und später den ganzen Rest haben: PionowaLinijka CXX0030: Fehler: Ausdruck nicht

ausgewertet werden kann

Oh, ich bin der Oen, der eine Frage gestellt hat, tut mir leid, dass ich mit Spitznamen verwechselt werde.

0

Das "Destroy" -Signal hat eine andere Signatur für seinen Callback als Ihre Wyjscie-Funktion. Vielleicht möchten Sie lieber die „zerstören-Ereignis“ von GtkWidget finden docs here

Wenn Sie die „zerstören“ Ereignis von GtkObject wollen, sehen here, müssen Sie Ihren Rückruf

void Wyjscie(GtkObject* window,StrukturaDrawing* data) 
{ 
gtk_main_quit(); 
free(data); 
} 
zu

ändern