Question

Avec fastmm4, on peut facilement enregistrer un pointeur divulgué, mais pas une chaîne divulguée. Apparemment le @ L'opérateur appliqué à une chaîne ne nous donne pas vraiment toute la chaîne, ni PChar(string); Que puis-je utiliser pour enregistrer bien une chaîne divulguée?

Pour l'instant, j'ai trouvé que cela fonctionne:

FastMM4.RegisterExpectedMemoryLeak(Pointer(NativeInt(PChar(StringVariable))-12));

Mais il repose sur le nombre magique 12, et c'est dépendant de la version, et le code n'exprime vraiment pas ce qui se passe. J'espère qu'il y a une fonction RTL quelque part qui prend une chaîne et rend un pointeur à la "base" de la chaîne, ou certains FastMM4 Méthode que j'ai négligé.

Je peux emballer cette laide bête d'expression dans une procédure comme celle-ci, mais je le trouve toujours hacky:

procedure RegisterExpectedStringLeak(const s:string);
begin
  {$IFDEF VER210}
  FastMM4.RegisterExpectedMemoryLeak(Pointer(NativeInt(PChar(s))-12));
  {$ELSE}
  {$MESSAGE Fatal 'This only works on Delphi 2010'}
  {$ENDIF}
end;

Cela devrait être sans importance pour la question. Voici pourquoi je fuit des cordes:

J'utilise un mécanisme de mise en cache pour stocker certaines données pour la durée de vie de l'application. Je n'ai pas l'intention de libérer ces objets, car j'en ai besoin pour la vie de l'application et passer par une finalisation appropriée uniquement le temps à la fermeture de l'application. Ces objets contiennent des champs de chaînes, donc évidemment ces chaînes sont "divulguées".

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top