2011-01-09 121 views
0

我具有以下结构:[C]的结构的动态分配存储器,与GTK

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

,我需要分配它在堆上因为后来我有使用该结构的功能和我不想要使用全局变量。所以我给它分配是这样的:

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

而且它不会返回错误,并与其他功能的伟大工程,它的工作原理我想它所以最后的工作方式,我想释放内存,这里是问题因为在调试模式下编译器母狗:

GTK.exe中0x102d12b4的第一次机会异常:0xC0000005:访问冲突读取位置0xfffffffc。 GTK.exe中0x102d12b4未处理的异常:0xC0000005:访问冲突读取位置0xfffffffc。

我连接回调我的功能,这样的:

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

函数,它是想以释放内存和关闭程序:

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

任何帮助非常感激。

回答

0

嗯德宁调试数据结构具有下列值: 第一个具有:PoziomaLinijka CXX0017:错误:符号“”未找到 和后来的整个其余部分具有:PionowaLinijka CXX0030:错误:表达无法评估

哦:我是个开始质问的人,很抱歉与绰号混淆。

0

“摧毁”信号与其Wyjscie函数的回调签名不同。也许您更希望的GtkWidget的“破坏事件”,看文档here

如果你想GtkObject的“消灭”事件,看到here,您对自己的回调改变

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