2012-03-09 1 views
2

Большинство приложений с открытым исходным кодом с использованием GTK Я столкнулся с литым g_free как GWeakNotify. В то время как подпись g_free допускает один аргумент: g_free(), GWeakNotify typedef допускает два: GWeakNotify.Каковы предостережения о литье g_free в GWeakNotify?

Я написал простую программу для проверки литых и выглядит нормально - то есть, второй параметр «пусть через»:

#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) Почему компилятор не жалуется на это, учитывая две подписи (1 параметр для g_free и два для GWeakNotify)?

Спасибо! P

ответ

2

Так работает конвенция о вызове C; вызывающий код толкает аргументы в стек и очищает их снова. Вызываемой функции не волнует, сколько аргументов существует, она использует только те, которые ей нужны. Вот как могут работать функции с переменным аргументом, такие как printf().

Компилятор не жалуется на него именно из-за литья GWeakNotify; в основном вы говорите «Не жалуйтесь, что эти функции имеют разные подписи». Если бы вы отказались от актерского состава, он бы пожаловался.

(Обратите внимание, что pData никогда не будет NULL в вашем коде;. g_malloc() прервет программу, если она не может выделить требуемую память Если вы хотите другое поведение, используйте g_try_malloc() или регулярное malloc().)

+0

Похоже тип (например, используемый GWeakNotify) является одним из способов обхода/обмана проверки подписи функции во время компиляции. Спасибо за информацию! – Piotrek

 Смежные вопросы

  • Нет связанных вопросов^_^