IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Delphi Discussion :

SmartPtr pointeur sans FreeMem


Sujet :

Contribuez Delphi

  1. #1
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut SmartPtr pointeur sans FreeMem
    si vous utiliser dans vos codes beaucoup de GetMem/FreeMem cette unité permets d'alouer de mémoire sans etre obliger d'appeler Freemem a la fin
    SmartMem.pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    unit SmartMem;
     
    interface
     
    type
      TMem = packed array of  byte;
      SmartPtr = record
        Ptr      :Pointer;
        Reserved :TMem;
      end;
     
    function MEMAlloc(Size:integer;var Anchor:SmartPtr):Pointer;
    function MEMGet(Size:integer;var Anchor:SmartPtr):Pointer;
    procedure MEMRealloc(var P:Pointer;Size:integer;var Anchor:SmartPtr); overload;
    procedure MEMRealloc(Size:integer;var Anchor:SmartPtr);               overload;
    procedure MEMFree(var Anchor:SmartPtr);
     
    implementation
     
    type
       PDynRec= ^TDynRec;
       TDynRec= record
         RC    : Integer;
         Length: integer;
       end;
       PDynAr = ^TDynAr;
       TDynAr = packed record
         Mem   : TDynRec;
         Bytes : array[0..0]of byte;
       end;
    const
       DYNOFFSET = SizeOf(TDynRec);
     
    function MEMGet(Size:integer;var Anchor:SmartPtr):Pointer;
    begin
        MEMFree(Anchor);
        GetMem(PByte(Result),Size + DYNOFFSET);
        with Anchor,PDynAr(Result)^ do
        begin
           Mem.RC     := 1;
           Mem.Length := Size;
           Result     := @Bytes;
           Ptr        := Result;
           Pointer(Reserved):= Result;
        end;
    end;
     
    function MEMAlloc(Size:integer;var Anchor:SmartPtr):Pointer;
    begin
        Result := MEMGet(Size,Anchor);
        FillChar(Pointer(Anchor.Reserved)^,Size,0);
    end;
     
    procedure MEMRealloc(var P:Pointer;Size:integer;var Anchor:SmartPtr);
    begin
        P := Pointer(Anchor.Reserved);
        if Size = 0 then
            MEMFree(Anchor)
        else if P = nil then
            P := MEMGet(Size,Anchor)
        else begin
            Dec(Integer(P),DYNOFFSET);
            ReallocMem(PByte(P),Size + DYNOFFSET);
            with Anchor,PDynAr(P)^ do
            begin
               Mem.Length := Size;
               P          := @Bytes;
               Ptr        := P;
               Pointer(Reserved):= P;
            end;
       end;
    end;
     
    procedure MEMRealloc(Size:integer;var Anchor:SmartPtr);
    begin
        Anchor.Ptr := Pointer(Anchor.Reserved);
        MEMRealloc(Anchor.Ptr,Size,Anchor);
    end;
     
    procedure MEMFree(var Anchor:SmartPtr);
    begin
        if Pointer(Anchor.Reserved) <> nil then
        begin
            Dec(Integer(Anchor.Reserved),DYNOFFSET);
            FreeMem(PByte(Anchor.Reserved));
            Pointer(Anchor.Reserved) := nil;
        end;
    end;
     
    end.
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    var
      M:SmartPtr;
    begin
      MEMGet(SizeOf(TBitmapInfoHeader),M);
      with PBitmapInfoHeader(M.Ptr)^ do
      ...
     
    var
      M:SmartPtr;
      P:PBitmapInfoHeader;
    begin
      P:= MEMGet(SizeOf(TBitmapInfoHeader),M);
      with P^ do
      ...

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    je ne comprend rien à ce code...en quoi permet-il de se passer de la libération ?!
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    La libération de mémoire se fait a la finalisation de record SmartPtr.Reserved ...mais on peut la faire manuellement avec MEMFree

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    ahhhh !!!! tu réinventes les tableaux dynamiques !

    et pourquoi pas simplement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    type
      SmartPtr = record
        Ptr: Pointer;
        Reserved: array of Byte;
      end;
     
    function MEMAlloc(Size: Integer; var Anchor:SmartPtr): Pointer;
    begin
      SetLength(Anchor.Reserved, Size);
      Anchor.Ptr := Pointer(Anchor.Reserved);
      Result := Anchor.Ptr;
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Pas possible imagine un SmartPtr passer comme const sur une autre fonction !

  6. #6
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Citation Envoyé par Montor Voir le message
    Pas possible imagine un SmartPtr passer comme const sur une autre fonction !
    hum...je ne vois pas bien où tu veux en venir...
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure DoSomeThing(APtr:SmartPtr);
    begin
     
    end;
     
    var
      M:SmartPtr;
      P:PBitmapInfoHeader;
    begin
      P:= MEMGet(SizeOf(TBitmapInfoHeader),M);
      DoSomeThing(M);//ici
    Que pense-tu si je passe Smartptr dans une autre contexte

  8. #8
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Citation Envoyé par Montor Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure DoSomeThing(APtr:SmartPtr);
    begin
     
    end;
     
    var
      M:SmartPtr;
      P:PBitmapInfoHeader;
    begin
      P:= MEMGet(SizeOf(TBitmapInfoHeader),M);
      DoSomeThing(M);//ici
    Que pense-tu si je passe Smartptr dans une autre contexte
    j'avais compris la question, mais pas les conséquences que tu images...ni la différence avec ton code...d'autant qu'ici DoSomeThing ne fait rien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure DoSomeThing1(APtr:SmartPtr);
    begin
      MEMAlloc(10,APtr); // M n'est pas affecté
    end;
     
    procedure DoSomeThing2(APtr:SmartPtr);
    begin
      Byte(APtr.Ptr^) := 255; // le contenu de M l'est
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

Discussions similaires

  1. Procédure avec type string sans pointeur
    Par mouiteu dans le forum Débuter
    Réponses: 12
    Dernier message: 23/11/2008, 16h34
  2. Liste chaînée sans pointeur
    Par lyes312 dans le forum Langage
    Réponses: 19
    Dernier message: 21/06/2008, 18h39
  3. Pointeur souris sans CEGUI
    Par Novys dans le forum Ogre
    Réponses: 3
    Dernier message: 07/11/2007, 09h19
  4. Declarer un pointeur vers une classe sans new ?
    Par zi_omnislasher dans le forum C++
    Réponses: 15
    Dernier message: 28/09/2007, 11h51
  5. conserver ma liste d'objets sans Pointeur Null ...
    Par comme de bien entendu dans le forum Général Java
    Réponses: 8
    Dernier message: 24/03/2006, 11h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo