Jump to content
×
×
  • Create New...

Allocation de Mémoire


Wolfae

Recommended Posts

Niveau requis Intermédiaire

Temps estimé : 30 minutes

Bonjour,

 

Ce nouveau 'chapitre' est fait par demande de 'shaip' (Si j'ai bien compris ta requête.. ><') et a comme sujet l'allocation de mémoire et le Ramasse-miettes. Le CLR fait son travail lui-même, et le fait mieux que nous; Laissez-le le faire si vous ne savez pas ce que c'est..

 

Révélation

 

Le Garbage Collector (Ramasse-miettes) désalloue automatiquement (Ou presque..) et release (libère) la mémoire pour les objets créés dans l'application. Quand l'objet n'est plus référencé, il est directement supprimé et la mémoire est libérée. On peut forcer le garbage collector à faire son travail, avec une méthode non asynchrone GC.Collect() puis GC.WaitForPendingFinalizers().

//C#
//Program.cs
class Program
{
  static void Main(string[] args)
  {
    GC.Collect();
    GC.WaitForPendingFinalizers();
  }
}
//Utilisation de GC.Collect() et GC.WaitForPendingFinalizers()//

 

Cette méthode force, comme dit précédemment, la collection par le GC (=Garbage Collector).

 

Notes : -GC.Collect() est expensive, et devrait mieux être utilisée quand vous en avez vraiment besoin, et devez l'utiliser pour faire une collecte GENERALE.

 

  • Si GC.Collect() se trouve dans une même méthode qu'une var que vous avez et dont vous voulez release la mémoire, ce ne sera pas fait, puisque celle-ci sera considérée toujours appelée/référencée. (Le GC n'acte que sur ce qui n'a plus été référencé. Et puisque le GC serait "appelé" dans la même méthode que la variable, la méthode sera toujours en cours.)
  • GC.Collect() ne devrait pas être utilisée pour clear un seul truc.

 

 

Tips & Tricks 1 : Using

 

Révélation

 

Peu connaissent la deuxième "using" : A part pour faire des références aux namespaces, using peut être utilisée comme ceci :

//C#
//Random code snippet
[..]
Bot bta;
using(bta)
{
  //Utilisez BTA.
}
[..]
Comme ça, après l'utilisation, BTA est directement Disposée (Voir Tips & Tricks 2). On peut utiliser plusieurs vars au lieu d'une seule :
using(Bot bta = new Bot(), 
       Bot btax = new Bot() )
{
  //Utilisez BTA et BTAX.
}
 


Tips & Tricks 2 : Dispose

 

Révélation

 

Exemple
//C#
//disposeexample.cs

using System;
using System.ComponentModel;

class Exemple: IDisposable
{
 private bool disposed = false; // Si l'objet est déjà disposé.
 private Component component = new Component(); // Le composant..
 private Intptr handle; // Handle.

 public void Dispose()
 {
   Dispose(true);
   GC.SuppressFinalize(this);
 }

 private void Dispose(bool disposing)
 {
    if(!this.disposed)
    {
      if(disposing)
          component.Dispose();

      CloseHandle(handle);
      handle = IntPtr.Zero;
    }
    disposed = true;
 }

 //INTEROP
 [system.Runtime.InteropServices.DllImport("Kernel32")]
 private extern static Boolean CloseHandle(IntPtr handle);

 ~Exemple()
 {
   Dispose(false); //Et hop, on dispose. :b
 }
}
Interop, Handle, etc.. Ca fait assez avancé. Je recommande moins Dispose, sauf si vous savez vraiment ce que vous faites. Utilisez GC.Collect() et GC.WaitForPendingFinalizers() plutôt que ceci, surtout si vous avez plusieurs objets inutilisés.

 

 

Cordialement,

Heaven Team 2012

Non mudera, potius mori quam foedari.

 

Connaissances : C#, VB.net, JavaScript, PHP

Libre service.

Link to comment
  • Replies 0
  • Created
  • Last Reply

Top Posters In This Topic

Popular Days

Top Posters In This Topic

Popular Days

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.