Les variables locales (dites aussi "automatiques") du genre:
void fonction(char param)
{
int variableLocale;
}
Sont stockées sur la pile du thread correspondant, la pile est une zone de mémoire de taille fixe réservée dès la création d'un thread. Tu ne peux pas libérer cette mémoire à part en fermant le thread (si ton programme ne comporte qu'un seul thread cela revient à fermer le programme lui-même).
Quand tu appelles une fonction les paramètres de la fonction ainsi que ses variables locales sont stockées sur la pile. Il y a parmi les registres du processeur un registre que l'on nomme le "stack pointer" ou SP qui contient une adresse qui pointe vers le sommet actuel de la pile (le premier emplacement mémoire non occupé de la pile en gros).
Lorsque tu stock une variable sur la pile, l'emplacement pointé par SP prend la valeur de cette variable et le SP est ensuite décrémenté pour pointer vers le nouveau premier emplacement libre. Quand tu sors de la fonction, vu que tu n'as plus besoin de ces variables le SP va être incrémenté pour pointer vers l'emplacement sur lequel il pointait avant de rentrer dans la fonction, et les emplacements de la pile précédemment occupées par les variables locales de cette fonction seront écrasées par de futurs variables locales mais à vrai dire il n'y a aucune mémoire qui est réellement libérée, la taille de la pile reste la même jusqu'à la fermeture du thread.
Tu peux incrémenter ou décrémenter manuellement le SP avec du code assembleur (la plupart des compilos c++ ont un assembleur en ligne et te permettent d'incruster de l'assembleur dans ton code C++), tu pourrais écrire une fonction en assembleur où tu "libère" (une fois de plus au sens figuré vu que la taille de la pile reste la même) toi-même les emplacements occupées par les variables locales de ta fonction (en incrémentant le SP) avant d'en sortir mais la convention veut que cela ne soit fait qu'à la sortie de la fonction, faire les choses autrement ne servirait à rien de toute façon.
Quant aux variables statiques ou globales, elles sont stockées dans ce qu'on peut appeler la "zone de données" (elle-même généralement divisée en plusieurs zones) qui est aussi de taille fixe, ces variables sont disponibles dès le lancement du programme et jusqu'à sa fermeture donc c'est pareil, tu ne peux pas libérer cette mémoire, tout du moins pas sans fermer le programme.