je pense que vous faites des objets non globaux sans le savoir.
Par exemple si vous écrivez
void afficherX(int x) {
String message = "le nombre vaut ";
message += x;
Serial.println(message);
}
L'objet message est local à la fonction. Il est crée lorsque l'on rentre dans la fonction et libéré automatiquement quand on en sort.
Sinon les instances classiques (Serial, vos boutons, LCD, ...) sont globales parce qu'on veut qu'elles durent tout le temps du programme et on veut souvent y avoir accès partout dans le code.
En C++ quand le programme se termine, tous les objets sont libérés (leur destructeur est appelé) avant de vraiment finir, y compris les globaux, mais sur un micro-contrôleur, le programme tourne généralement en boucle infinie et ne se termine pas vraiment sauf si on coupe l'alim, donc les destructeurs des objets globaux ne sont presque jamais appelés automatiquement.