亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標題: GTK不用釋放的? [打印本頁]

作者: C.J    時間: 2008-10-01 19:08
標題: GTK不用釋放的?
剛開始用 GTK, 抄了幾段代碼, 也隨便改了下, 發(fā)現(xiàn)用了 很多 xxx_new ,
但是 只在 window 結(jié)束時有個 gtk_main_quit(), 那么我那些 new出來的東東 是否會有問題? 這樣做是規(guī)范的嗎?
作者: rushrush    時間: 2008-10-04 12:58
規(guī)范.. 有些命令行程序.. 運行下就退出的 也是只malloc不free  :wink:
作者: 融化的冰山    時間: 2008-10-06 10:45
你用xx_new生成的東西都在用戶空間里面,會在進程結(jié)束的時候被系統(tǒng)回收掉。
所以退出的時候可以直接調(diào)用gtk_main_quit()。

你如果想寫的規(guī)范一些,可以自己寫一下釋放函數(shù),手動釋放一下這些東西,對于以后
寫一些常駐內(nèi)存的程序會有幫助的。
作者: chinalmy    時間: 2008-10-07 16:23
gtk_main_quit()負責回收
作者: C.J    時間: 2008-10-07 20:44
謝謝各位。
作者: UnixZC    時間: 2008-10-09 16:29
有文檔說gtk_main_quit負責回收了?????
作者: 何強    時間: 2008-11-17 14:27
回收的時候直接free對象指針嗎?
我寫程序的時候一直都比較注意內(nèi)存,倒是沒有寫過常駐內(nèi)存的程序!
作者: anbutu    時間: 2008-11-20 22:09
GTK+ 基于GObject,對象一般是通過 g_object_unref 來釋放的
作者: Sam1860    時間: 2008-11-22 17:12
g_free()

g_object_unref 不要隨便調(diào),看清楚文檔吧
作者: arust    時間: 2008-11-25 14:55
wxWidgets 好像也是這樣的,自帶的例子都是只有new
作者: naihe2010    時間: 2008-11-25 16:33
標題: 回復(fù) #9 Sam1860 的帖子
_new出來的東西,絕對不能g_free。

一般來說,_new對應(yīng)的是_destroy。
g_free,是處理你g_malloc出來的動態(tài)內(nèi)存的。
作者: Sam1860    時間: 2008-11-25 17:58
原帖由 naihe2010 于 2008-11-25 16:33 發(fā)表
_new出來的東西,絕對不能g_free。

一般來說,_new對應(yīng)的是_destroy。
g_free,是處理你g_malloc出來的動態(tài)內(nèi)存的。



建議你先查查文檔,看看有多少個_new是有對應(yīng)_destroy
作者: naihe2010    時間: 2008-11-26 10:16
標題: 回復(fù) #12 Sam1860 的帖子
_destroy,是對應(yīng)你_new返回的結(jié)構(gòu)的。當然不對稱!
作者: Sam1860    時間: 2008-11-26 11:26
原帖由 naihe2010 于 2008-11-26 10:16 發(fā)表
_destroy,是對應(yīng)你_new返回的結(jié)構(gòu)的。當然不對稱!


你在自打嘴巴嗎?如果不對稱,沒有destroy方法的類都不能釋放內(nèi)存了?

比如gtk_button_new ()一個button,在“絕對不能用g_free()"的情況下,請問一下應(yīng)該怎樣釋放這個button對象呢?
作者: Sam1860    時間: 2008-11-26 11:30
destroy方法只是某些特定對象才用的釋放方法,如GNode, GTree這些有父子關(guān)系的組件,_destroy方法是個方便的方法,可以把子元素一并釋放
某些組件也提供了gtk_XXXX_free()方法,但都是只有小數(shù)組件才有
g_free()才是通用的釋放方法
作者: connet    時間: 2008-11-26 21:11
對于 gtk 控件, 不需要你手動 free
關(guān)閉窗口時 窗口會 自己free 掉, 并自動 free 屬于它的控件
控件不需要你 free, 你不使用時  g_object_unref 掉, 系統(tǒng)會在合適的時候free
作者: anbutu    時間: 2008-11-26 21:58
對于GtkWidget 用 gtk_widget_destroy 釋放
作者: naihe2010    時間: 2008-11-27 09:39
標題: 回復(fù) #14 Sam1860 的帖子
哈哈,所以你沒明白什么叫做_destroy它的_new的結(jié)構(gòu)。

你看看gtk_button_new的返回值是什么?
是widget,當然你想銷掉它就用gtk_widget_destroy啊。
作者: naihe2010    時間: 2008-11-27 09:49
標題: 回復(fù) #15 Sam1860 的帖子
你敢不敢編譯一下這個程序,然后分別定義與非定義那個宏,然后跑一下看看,告訴我你是怎么讓它崩潰的嗎?


  1. #include <gtk/gtk.h>

  2. //#define FUCK_G_FREE

  3. int
  4. main (int argc, char *argv[])
  5. {
  6.   GtkWidget *window_main;
  7.   GtkWidget *button_exit;
  8.   gtk_init (&argc, &argv);
  9.   window_main = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  10.   button_exit = gtk_button_new_with_label ("Exit");

  11.   gtk_container_add (GTK_CONTAINER (window_main), button_exit);

  12.   gtk_widget_show_all (window_main);

  13. #ifdef FUCK_G_FREE
  14.   g_free (button_exit);
  15. #else
  16.   gtk_widget_destroy (button_exit);
  17. #endif

  18.   gtk_main ();

  19.   return 0;
  20. }
復(fù)制代碼

作者: naihe2010    時間: 2008-11-27 09:52
標題: 再補充一下g_free的官方文檔!
g_free ()

void                g_free                              (gpointer mem);

Frees the memory pointed to by mem. If mem is NULL it simply returns.
mem :         the memory to free

請相關(guān)人好好看看這個連接,讀一讀。
http://library.gnome.org/devel/g ... ory-Allocation.html
作者: naihe2010    時間: 2008-11-27 10:01
標題: 回復(fù) #15 Sam1860 的帖子
g_free的實現(xiàn),就是通過一個面向?qū)ο蟮奶摫,來實現(xiàn)的:

void
g_free (gpointer mem)
{
  if (G_UNLIKELY (!g_mem_initialized))
    g_mem_init_nomessage();
  if (G_LIKELY (mem))
    glib_mem_vtable.free (mem);
}
// 見gmem.c:181


而glib_mem_vtable,為:
/* --- variables --- */
static GMemVTable glib_mem_vtable = {
  standard_malloc,
  standard_realloc,
  standard_free,
  standard_calloc,
  standard_try_malloc,
  standard_try_realloc,
};
// 見gmem.c:110

而這個standard_free為:
#ifdef SANE_MALLOC_PROTOS
#  define standard_free                free
#else
static void
standard_free (gpointer mem)
{
  free (mem);
}
#endif
// 見gmem.c:71
作者: Sam1860    時間: 2008-11-28 10:52
OK,我承認,我錯了
作者: naihe2010    時間: 2008-11-28 11:35
標題: 回復(fù) #22 Sam1860 的帖子
嘿嘿。

你可能是把g_object_unref和g_free搞混了吧?對于object派生出來的結(jié)構(gòu),的確用g_object_unref可以通用的不直接地釋放掉它。但沒有_destroy相應(yīng)的結(jié)構(gòu)明了。
作者: UnixZC    時間: 2008-12-02 13:13
原帖由 naihe2010 于 2008-11-28 11:35 發(fā)表
嘿嘿。

你可能是把g_object_unref和g_free搞混了吧?對于object派生出來的結(jié)構(gòu),的確用g_object_unref可以通用的不直接地釋放掉它。但沒有_destroy相應(yīng)的結(jié)構(gòu)明了。

Gtk.org上是這么寫的,對于從GtkObject派生的object,通常你不需要調(diào)用g_object_unref來釋放,只要你將它加入到一個Gtk的container中,那么當頂層的widget被destroy的時候,會自動的去釋放他包含的這些object,這樣做的理由就是方便C寫代碼,具體的你可以看看gtk.org的幫助文檔,而對于從GObject派生的object,我認為你應(yīng)該釋放ref,你可以通過寫個程序來試試,你手動的釋放是不會出錯的,但GtkObject就會出錯,應(yīng)該在運行的時候出現(xiàn)warning之類的。所以前面有人說程序退出,gtk自動釋放我還真不知道,因為在gtk。org上我沒有找到相應(yīng)的說法,也不知道不釋放會不會出現(xiàn)內(nèi)存泄漏。那位達人知道的還煩告知
作者: Sam1860    時間: 2008-12-03 10:55
標題: 回復(fù) #24 UnixZC 的帖子
這點不需要gtk文檔說明吧,應(yīng)該看所用OS的文檔
在linux,進程退出,該進程占用的內(nèi)存都會由OS自動回收的
作者: lantian728    時間: 2010-12-31 16:38
malloc不free
作者: nizvoo    時間: 2011-01-21 09:31
只要不是反復(fù)new的東西,一般不需要去free,比如程序已啟動就new一塊大內(nèi)存或是初始化一些東西,生命周期結(jié)束就是程序退出一般不需要free的,像wxWidget或是gtk他們new出來的控件,也是不需要free的。
作者: lantian728    時間: 2011-01-26 16:50
gtk_main_quit()  回收
作者: eaglexmw    時間: 2011-02-08 12:13
使用OS來釋放這些東西通常不太好吧,畢竟OS這么做是主要針對出錯的程序而言的

GTK庫自己釋放的話更可以接受




歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2