P.S: Che vuol dire che "fa da wrapper sulla prima"?
In effetti non sono proprio certo che sia un termine corretto in questo caso (al limite arriverà oregon e mi martellerà i ditini), comunque "wrapper" significa "involucro": in pratica questa funzione ti nasconde la presenza dell'altra, e ti da un modo di utilizzarla senza incorrere in errori.

Continuo a non capire, ma va beh, ti prendo sulla parola
Prova con un esperimento:

codice:
int x = 0;
int* ptr = &x;

free(ptr);
//ptr = NULL;
free(ptr);
Prova ad eseguirlo con e senza la riga commentata e vedrai cosa succede

P.S: Riguardo il metodo corretto per deallocare mi basta richiamare la free sul puntatore alla struct o devo deallocare anche singolarmente la key, il payload? Per le funzioni non c'è nulla da deallocare credo...
Hai ragione scusa, essendo dei puntatori devi deallocare anche key e payload: infatti tu liberi la memoria dedicata al puntatore, ma non la memoria puntata da questo puntatore.

Sinceramente non ho mai provato a deallocare una funzione... chissà cosa succede? Ora ci provo