je ne suis pas sur d'avoir compris ce que tu as dit
en fait un string c'est une structure qui contient 3 éléments. Un compteur d'usage, une longeur, des caractères et un 0 terminal...donc 4 éléments
la variable de type string est un pointeur sur le 3ième élément (les caractères), à l'offset -4 et -8 on trouve le compteur de référence et la taille...le 0 terminal est en fin de chaine évidemment.
quand on affecte à une variable string une autre string, le compteur de référence de la première est décrémenté (sauf si la chaine est vide = nil), si ce compter tombe à zéro, la zone mémoire est libérée, puis le compteur de la seconde chaine est incrémenté et les deux variables pointent sur la même zone mémoire :
1 2 3 4 5 6 7 8 9 10 11 12 13
|
var
s1,s2:string;
begin
// s1 = s2 = nil
s1:='hello';
// si pointe sur le "h" qui est précédé de l'entier 6 soit "length(s1)" et de 1 le compteur de référence
s2:=s1;
// s2 et s1 pointent tous les deux sur le "h" et le compteur passe à 2
s1[2]:='a';
// vu que le compteur de rérérence est > 0, Delphi crée une nouvelle chaine sur laquelle s1 va pointer tandis que le compteur de référence de la chaine pointée par s2 passe à 1
// la nouvelle chaine pointe sur une chaine avec compteur à 1, length à 6 et les caractères "hallo"
end; |
ce code explique pourquoi le fait d'utiliser "safe" force le passage du compteur de référence à 2, et du coup la modification de "s" ne fait que décrémenter le compteur en allouant une nouvelle chaine pour "s". L'ancienne adresse de "s" qui est égale à "safe" est toujours valide dans le paramètre de la fonction.
sans "safe", le compteur est à 1, la chaine est libérée et une nouvelle est créée pour contenir le nouveau texte....le paramètre pointe sur une ancienne adresse qui n'est plus un string.
le compteur est à la même adresse que la chaine (enfin 4 octets avant en mémoire - ou 8 je ne sais jamais dans quel sens sont le compteur et la taille
) donc quand on modifie "s", on change l'adresse sur laquelle il pointe, tandis que l'adresse du paramètre ne change pas.
c'est justement parcequ'il ne fait rien que la chaine n'est pas conservée
Partager