En cours d'informatique en classe prépa, on nous apprend à écrire ce genre de code (ici une procédure supprimant une occurrence d'un élément dans une liste chaînée, s'il en existe) :
type
Liste = ^Cellule;
Cellule = record
tete: integer;
queue: Liste;
end;
procedure del(e:integer; l:Liste);
begin
if l <> nil then
if l^.queue <> nil then
if l^.queue^.tete = e then
l^queue = l^.queue^.queue
else
del(e,l^.queue);
end;
Ce code génère une fuite de mémoire manifeste, car la mémoire utilisée par l'élément supprimé n'est pas libérée. Anticipant la remarque, le professeur nous lance : « Si on voulait bien faire, il faudrait libérer la mémoire que prenait l'élément supprimé. Mais aujourd'hui, les ordinateurs ont tout de même beaucoup de mémoire, donc ça n'est pas nécessaire ».
Certes, les ordinateurs ont peut-être beaucoup de mémoire, mais si le programme en question est destiné a tourner plusieurs mois sans interruption, il aura toujours assez de mémoire, l'ordinateur ? PEBKAC.