Problème de libération de mémoire avec un UserControl

Résolu
rbidocho Messages postés 41 Date d'inscription jeudi 7 juin 2007 Statut Membre Dernière intervention 15 septembre 2008 - 13 juin 2007 à 11:14
rbidocho Messages postés 41 Date d'inscription jeudi 7 juin 2007 Statut Membre Dernière intervention 15 septembre 2008 - 13 juin 2007 à 11:54
Bonjour,

ma config : Win XP SP1 .Net Framework 1.1
IDE et Programmation: SharpDevelop 1.1 en VB.NET

Mon petit souci :

Depuis mon MainForm, j'appelle une classe qui insère un UserControl (graphique en bmp dans un panel) dans mon MainForm.
Cet Appel peut se faire (et se fait) plusieurs fois.
Jusqu'ici pas de problème.

Le problème survient quand je veux supprimer le UserControl tout en libérant la mémoire :

voici le code (épuré) de la procédure qui est dans le MainForm
            Public Sub Tracer()

                   'Effacement du UserControl si il existe
                For Each Ctrl As system.Windows.Forms.Control In Me.tabPageCourbePolluants.Controls
                    If Ctrl.Name = "UcGraphXY" Then
                        Me.tabPageCourbePolluants.Controls.Ctrl.remove (Ctrl)
                    End If
                Next

                Dim UcG as UcGraphXY = new UcGraphXY
                    'lignes de contruction de mon UserControl

                'Ajout du UserControl dans mon MainForm
                Me.tabPageCourbePolluants.Controls.Add(UcG)
            End Sub

Donc si j'ai bien compris, je ne fais que supprimer visuellement le UserControl mais cela ne libère pas la mémoire (Augmentation de 3MO à chaque appel).

Si vous avez une solution, je vous en remercie d'avance

RB

2 réponses

cs_niky Messages postés 168 Date d'inscription jeudi 28 juin 2001 Statut Membre Dernière intervention 18 octobre 2008 7
13 juin 2007 à 11:32
Salut,

Si tu ajoutes Ctrl.Dispose juste à après l'appel à remove, tu demandes à ton objet de libérer les ressources non managées qu'il utilise. En surchargeant la méthode Dispose dans ton UserControl, tu peux aussi libérer tes propres objets (par exemple l'image bitmap).
La mémoire sera peut être libérée...

Sinon, comme .Net gère lui-même la mémoire, il se chargera bien à un moment de collecter ton objet.
Tu peux le forcer en appelant System.GC.Collect... mais c'est pas très recommandé.
3
rbidocho Messages postés 41 Date d'inscription jeudi 7 juin 2007 Statut Membre Dernière intervention 15 septembre 2008
13 juin 2007 à 11:54
Merci Niky pour cette rapide reponse.


J'ai donc rajouté Ctrl.Dispose()


et dans ma classe :

        Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)

            If disposing Then

                If Not (components Is Nothing) Then

                    components.Dispose()

                End If

            End If

            MyBase.Dispose(disposing)

        End Sub

       

et la mémoire semble être relativement constante
0
Rejoignez-nous