函数的调用者拥有数据的所有权,并负责释放它

问题描述 投票:0回答:1

标题中引用的注释经常可以在

GTk4
的文档中找到。 我的问题是:有没有一种技术方法可以检查程序以确定所有相关数据是否已按时发布。 我想用一个基于问题 Populate dropdown with strings in GTK4.

的示例来说明这一点

我测试了程序如下:

#include"dropdown-glist.h"

// callback function
void cb_test(GtkDropDown *self,GParamSpec *spec, gpointer data)
{
     GObject* object = gtk_drop_down_get_selected_item (self);
     const char *key = gtk_string_object_get_string(GTK_STRING_OBJECT(object));
     gchar *value =g_hash_table_lookup (data, key);

     g_print("select: %s  %s\n",key,value);
}

void activate (GtkApplication *app, gpointer data)
{
  GtkWidget *window;

  window =gtk_application_window_new(app);
  gtk_widget_set_size_request(window,50,50);
 
  //GHashTable persists after "activate" 
  GHashTable *hash_table = g_hash_table_new(g_str_hash,g_str_equal);

  GtkWidget *drop_down = gtk_drop_down_new(NULL,NULL);

  g_hash_table_insert(hash_table,"Key0","value0");
  g_hash_table_insert(hash_table,"Key1","value1");
  g_hash_table_insert(hash_table,"Key2","value2");
  g_hash_table_insert(hash_table,"Key3","value3");

  guint hash_size;
  /* Get the keys, which are strings, as an array */
  gpointer key_array = g_hash_table_get_keys_as_array (hash_table, &hash_size);
  /* Create a new GtkStringList model from the array of strings. */
  GtkStringList *stringlist = gtk_string_list_new (key_array); 
  /* Set the model as the source for the dropdown menu. */
  gtk_drop_down_set_model (GTK_DROP_DOWN(drop_down), G_LIST_MODEL(stringlist)); 
  // nothing selected
  gtk_drop_down_set_selected (GTK_DROP_DOWN (drop_down),GTK_INVALID_LIST_POSITION);

  //only here so that changes in the dropdown do not lead to a callback beforehand
  g_signal_connect(drop_down, "notify::selected-item", G_CALLBACK(cb_test),hash_table);

  GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,10);
  gtk_box_append(GTK_BOX(box),drop_down);
  gtk_window_set_child(GTK_WINDOW(window),box);

  gtk_widget_set_visible(window,TRUE);
}

有一种技术方法可以检查我是否

hash_table
在这个例子中必须被释放吗?

感谢您的解释性回复。

c memory-management code-analysis glib gtk4
1个回答
0
投票

函数

g_hash_table_new()
https://docs.gtk.org/glib/type_func.HashTable.new.html 是一个“构造函数”,它将代表您创建一个哈希表并返回一个指向您的指针。就像您的问题一样,它标记为:“被调用的函数拥有数据的所有权,并负责释放它”。由于您通过指针获取表,因此您有责任“释放”表。它是一个引用计数对象,因此如果您能够检查该对象的引用计数,它应该为 1。因此,在程序中的某个位置您必须使用 g_hash_table_unref() 或 g_hash_table_destroy() 它。所以,关于你的问题,你不需要有一个技术工具,文档说得足够了,它通过你负责的指针向你传递一个哈希表。

例如,您可以将一个函数连接(g_signal_connect())到 GioApplication::shutdown 信号,将哈希表作为数据传递并在那里销毁它,GtkApplication 是一个 GioApplication。

使用 valgrind 工具运行程序的调试版本可能会导致分配的哈希表未释放的内存泄漏。不过,您可能想使用一些 glib/gtk valgrind 抑制文件..

© www.soinside.com 2019 - 2024. All rights reserved.