AllocationMemory et pointeur

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
dd1971
Messages : 14
Inscription : mar. 09/janv./2007 16:53

AllocationMemory et pointeur

Message par dd1971 »

Quand je lance le programme les prenom sont bien supprimés
de la mémoire mais pas les ages, quelqu'un pourrait-il m'aider,
j'ai commencé PB depuis à peine une semaine, voici le prog.
(que j'ai pris et essayé de le modifier) :

Code : Tout sélectionner

Structure personnes 
  prenom.s
  age.w
EndStructure

Procedure.l Allocation(*prenom,*age)

 Protected *args.personnes = AllocateMemory(SizeOf(personnes))
 
 If *args 
   *args\prenom = PeekS(*prenom)
   *args\age = PeekW(*age)
 EndIf
 
 ProcedureReturn *args 
 
EndProcedure

Procedure.l MaProcedure_Free(*args.personnes)
 
  If *args
    FreeMemory(*args)
  EndIf
 
EndProcedure

leprenom.s = "toto"
lage.w = 36
*a.personnes = Allocation(@leprenom,@lage)

leprenom.s = "soso"
lage.w = 22
*b.personnes = Allocation(@leprenom,@lage)

If *a Or *b
 
  Debug *a\prenom
  Debug *a\age
  Debug *b\prenom
  Debug *b\age
     
  MaProcedure_Free(*a)
  MaProcedure_Free(*b)

  Debug *a\prenom
  Debug *a\age
  Debug *b\prenom
  Debug *b\age

EndIf
;###################

Merci d'avance


/modérateur: mis le code entre les balises.
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

bienvenu sur le forum.


le code ci dessus est bon en fait. pour préciser un peu :

1/
il faut savoir que FreeMemory() ne change pas la mémoire.
Ca dit juste à Windows que le bloc mémoire n'est plus utilisé (et donc réutilisable) mais la mémoire n'est pas pour autant remplie de zéro.
donc si on tente d'accéder à la mémoire (qui n'est plus allouée) c'est petit bonheur la chance... tant qu'aucun processus n'a écrit dedans...

2/
la meilleure façon de ne pas se tromper c'est éventuellement de mettre à zéro les variables *a et *b, comme çà plus moyen d'y accéder dans le code sans plantage.

Code : Tout sélectionner

MaProcedure_Free(*a) : *a = #Null
MaProcedure_Free(*b) : *b = #Null
ou

Code : Tout sélectionner

*a = MaProcedure_Free(*a) 
*b = MaProcedure_Free(*b)
Image
Répondre