Allocation dynamique : bonne ou mauvaise idée #POO

Salut à toutes et tous,

Un truc qui mériterait quelques clarification c’est lors d’un allocation dynamique (Toto * monObjet = new Toto()), comment appeler le destructeur ? Pendant le programme ça semble simple (delete monObjet), mais comment libérer la mémoire quand on quitte un jeu ? Je me suis toujours casser les dents sur la META et à ce jour aucun de mes programmes ne fait appel au destructeur… vive les fuites de mémoire :sweat_smile:

Faut-il bannir l’allocation dynamique ?

Merci d’avance pour vos réponses,

Tu peux faire comme ça :

#include <Gamebuino-Meta.h>

class Shuttle {};

class Game {
 private:
  Shuttle *_shuttle;

 public:
   Game() { _shuttle = new Shuttle(); }
  ~Game() { delete _shuttle; }
  void begin() {}
  void loop() {}
};

Game game;

void setup() {
	gb.begin();
	game.begin();
}

void loop() {
	gb.waitForUpdate();
	game.loop();
}

La variable globale game occupe une zone mémoire allouée statiquement. Dès qu’elle sera détruite, la destruction des dépendances allouées dynamiquement suivront.

Mais de manière générale, il vaut mieux éviter les allocations dynamiques récurrentes qui vont fragmenter le tas (heap) à la longue… C’est notamment la raison pour laquelle il est vivement déconseillé d’utiliser la classe String qui fait de l’allocation dynamique à gogo… Quand le tas est parsemé de “trous” (suite à de multiples allocations / libérations), il se transforme en gruyère, et il est de plus en plus difficile d’y trouver une zone mémoire suffisamment large pour accueillir une nouvelle allocation qui demande un peu de place.

1 Like

Merci Steph pour ta réponse !

Bonjour Chris,
Pour compléter la réponse de @Steph : si tu te pose la question de ce que deviennent les allocations quand on quitte le programme, tout est libéré.
Contrairement à un ordinateur, il n’y a pas de système d’exploitation qui gère la mémoire : chaque programme (un jeu ou le loader) embarque son propre système de gestion de la mémoire.
C’est à dire que quand on change d’appli, tout est réinitialisé à zéro. C’est comme si on rebootait entre chaque programme.

1 Like

Merci pour cette précision @JMP :slightly_smiling_face:

1 Like

Merci Jean-Marie pour cette précision :smiley:

1 Like