c - 将 g_free 转换为 GWeakNotify 有哪些注意事项?

标签 c glib calling-convention

大多数使用 GTK 的开源应用程序我都遇到过将 g_free 转换为 GWeakNotify。而 g_free 的签名允许单个参数: g_free() ,GWeakNotify typedef 允许两个: GWeakNotify .

我编写了一个简单的程序来检查强制转换,它看起来不错 - 也就是说,第二个参数是“let through”:

#include <stdlib.h>
#include <stdio.h>

#include <gtk/gtk.h>

void
callFree(GWeakNotify notify, gpointer pData, GObject *pObject)
{
  notify(pData, pObject);
}

int
main(int argc, char **argv)
{
  (void)argc;
  (void)argv;

  gpointer pData = g_malloc(32);
  GObject *pNull = (GObject *)g_malloc(64);  //results in a 64B leak

  if (!pData)
  {
    fprintf(stdout, "Unable to allocate pdata\n");
  }
  else
  {
    fprintf(stdout, "pData allocated OK...freeing\n");

    callFree((GWeakNotify)g_free, pData, pNull);
  }

  return EXIT_SUCCESS;
}

我的问题是: 1)幕后发生了什么?第二个参数是否只是留在堆栈上而 g_free 不关心它(因为它不应该关心)?

2) 为什么编译器不提示给定两个签名(g_free 的 1 个参数和 GWeakNotify 的两个参数)?

谢谢!

最佳答案

这就是 C 调用约定的工作方式;调用代码将参数插入堆栈并再次清理它们。被调用的函数不关心有多少参数,它只使用它需要的参数。这就是 printf() 等可变参数函数的工作原理。

编译器不会因为 GWeakNotify 强制转换而提示它;基本上你是在告诉它“不要提示这些函数有不同的签名。”如果你忽略了 Actor 阵容,它会提示。

(请注意,代码中的 pData 永远不会为 NULL;如果 g_malloc() 无法分配请求的数据,则程序将中止程序内存。如果您想要其他行为,请使用 g_try_malloc() 或常规 malloc()。)

关于c - 将 g_free 转换为 GWeakNotify 有哪些注意事项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9627933/

相关文章:

c - 在C glib中解析url查询参数?

python - PyGObject GLib.MainLoop() 和异常

C:如何从 scanf 读取值直到读取给定值

c - 如何将字符缓冲区(带有 pcm 音频数据)转换为短缓冲区

c - 如何释放更复杂的嵌套结构

c - 如何在国际象棋 AI 中正确检查 caSTLing?

linux - 可以动态创建 gsettings 吗?

c - 哪种调用约定用于通过 .def 文件导出的函数?

x64 上的 COM 调用约定

c - 调用 printf 时的堆栈 View ?