大多数使用 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/