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

VB 6 et antérieur Discussion :

Instanciation d'objet et manipulation pointeurs


Sujet :

VB 6 et antérieur

  1. #1
    Candidat au Club
    Inscrit en
    Juin 2010
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Instanciation d'objet et manipulation pointeurs
    Bonjour,

    J'ai implémenté une classe en VB6 qui s'appelle Vector et agit comme la classe C++ de la STL.

    Afin d'obtenir des bonnes performances, j'utilise l'allocation et la réallocation directe de mémoire. Cela fonction très bien avec les types de base et les strings, mais mon programme plante lorsque j'essaie avec des objets.

    Le programme test qui plante systématiquement est le suivant: j'ai un premier vecteur v auquel je viens concaténer un second vecteur v2 qui lui contient un unique élément, 12.

    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
      Declare Sub copyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
     
    Private Sub test()
        Dim v As New Vector
     
        ' Concatène un vector après celui-là
        test2 v
     
        Debug.Print v.toString()
    end sub
     
      Private Sub test2(v As Vector)
        Dim v2 As New Vector
     
        v2.pushElement 12
     
        v.pushElement v2
      End Sub
    Je stocke les informations par référence dans v, pour un objet voici ce qui est écrit (version très simplifiée de la fonction):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Sub pushElement(ByRef v As Variant)
    ptr = ObjPtr(v)
    copyMemory m_pointers, ptr, 4
    end sub
    et je récupère ces informations ensuite avec getElement, qui est appelée dans toString():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Public Function getElement(i As Long) As Variant
    dim p as long
         copyMemory p, m_pointers, 4
     
         Dim oClone As Object
     
         copyMemory oClone, p, 4
     
         Set getElement = oClone
         copyMemory oClone, 0&, 4
    end function
    Le débugueur m'indique que le problème semble venir du fait qu'à la fin de test2, le garbage collector vient libérer l'espace mémoire occupé par v2, rendant son accès impossible par la suite - lapalissade.

    Il agit ainsi parce qu'il a constaté qu'aucune variable ne venait utiliser v2, et que donc il pouvait m'en débarasser. Si je lance le programme avec test2 qui renvoie v2 et qui est affecté dans test me confirme que le garbage collector est responsable.

    Comment puis-je faire pour 1/ le désactiver ou 2/ qu'il considère que ce vecteur est utilisé ailleurs et qu'il ne le libère pas?

    Merci

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour,

    Le garbage collector n'est pas du tout responsable de la destruction de ta variable v2.
    Ta variable v2 est déclarée en local dans test2, elle est donc détruite lorsque tu sorts de ta fonction test2.

    A+, Hervé.

Discussions similaires

  1. Problème pointeur et instanciation d'objet(new)
    Par Seabast888 dans le forum Débuter
    Réponses: 5
    Dernier message: 12/10/2009, 06h33
  2. [Reflection] Instancier un objet
    Par bl@st dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 28/10/2008, 11h09
  3. [POO] Instancier un objet avec le nom de la classe
    Par shinchun dans le forum Langage
    Réponses: 4
    Dernier message: 08/06/2006, 13h44
  4. instancier un objet Excel
    Par RobinNono dans le forum ASP
    Réponses: 1
    Dernier message: 13/12/2005, 15h51
  5. Manipulation pointeur delphi
    Par phb19 dans le forum Langage
    Réponses: 3
    Dernier message: 09/04/2004, 18h58

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