求C的GTK+窗口中内存释放方法

时哲 2008-10-21 09:26:21
大家好!有个棘手的问题,如何释放我在一个创建GTK+窗口中声明的结构体变量的指针?在什么地方释放?想请大家指点迷津。
代码如下,无关部分已略去。


void
create_winNewplan ( HildonProgram* hilpro )
{
………………//声明了一些窗体组件

DateTrans *dtInure = (DateTrans *)malloc(sizeof(DateTrans)); //分配给结构体DateTrans内存

………………//定义窗口部件的参数

dtInure->program = hilpro; //给结构体成员赋值

………………//回调函数
g_signal_connect (G_OBJECT (btTitlemodel), "clicked",
G_CALLBACK (dialog_calendar),
dtInure);//使用了该结构体做实参




感谢大家! 阿弥陀佛
...全文
291 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jufeng2309 2008-10-22
  • 打赏
  • 举报
回复

void
create_winNewplan ( HildonProgram* hilpro )
{
.......
.......


free(dtInure);
}

这样应该就可以。
once_and_again 2008-10-22
  • 打赏
  • 举报
回复
先释放结构体里面的指针,
再释放 结构体指针,
跟 c++一样,
先构造的后释放.
gtk的窗口,
gtk destrory.
时哲 2008-10-22
  • 打赏
  • 举报
回复
我刚才把free()放在了函数的最后,但是回调函数就无法获得动态分配的结构体指针了。具体这个free()应该放什么地方呢?
时哲 2008-10-22
  • 打赏
  • 举报
回复
我真是C语言没学好。

我注册了窗口的destroy事件,直接写的gtk_widget_destroy(GTK_WIDGET(window));

是不是,我把free的语句,放在所有回调函数的后面就可以了?

那么,也就是说,窗口运行后,执行到gtk_widget_show_all(GTK_WIDGET(window));就会停下来,等到gtk_widget_destroy才会向后运行完所有的代码?
jufeng2309 2008-10-22
  • 打赏
  • 举报
回复

g_signal_connect (G_OBJECT (btTitlemodel), "clicked",
G_CALLBACK (dialog_calendar),
dtInure);

这个只是个注册。

你想在回调函数里面还需要将dtInure的值返回,如果不需要的话可以直接在回调函数里面进行释放
chenzhixin 2008-10-22
  • 打赏
  • 举报
回复
晕,C语言没学好吧,肯定不会了,malloc你不free的话是不会释放掉的,
你注册下窗口的destroy事件,在里面free掉。

看你的代码,是个临时分配的,你在click的处理函数中使用完这个变量后free掉就可以了
时哲 2008-10-22
  • 打赏
  • 举报
回复
jufeng2309: 那么你看看刚才我代码里的结构体指针变量会不会在函数调用后,自己释放?谢谢!
jufeng2309 2008-10-22
  • 打赏
  • 举报
回复

具体情况具体分析,可以做一个类似垃圾收集器
全局的
一般可以在gtk_main_quit可以做处理
局部的
一般在程序函数调用后就可以free掉

关于gtk_window_new()
这些new出来的交给gtk自己处理。
wlabing 2008-10-22
  • 打赏
  • 举报
回复
没弄过GTK+,dtInure应该是作为参数传给回调函数(dialog_calendar)了吧?可以在你的回调函数里将它free掉。
时哲 2008-10-22
  • 打赏
  • 举报
回复
jufeng2309兄,这样是可以,但是上一条的回调函数会无法调用这个结构体。


………………//声明了一些窗体组件

DateTrans *dtInure = (DateTrans *)malloc(sizeof(DateTrans)); //分配给结构体DateTrans内存

………………//定义窗口部件的参数

dtInure->program = hilpro; //给结构体成员赋值

………………//回调函数
g_signal_connect (G_OBJECT (btTitlemodel), "clicked",
G_CALLBACK (dialog_calendar),
dtInure);//使用了该结构体做实参

free(dtInure);//执行回调函数时,就无法读取传递过去的对象了。

23,188

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧