Allocation importante

NairodDorian Messages postés 130 Date d'inscription lundi 26 juin 2006 Statut Membre Dernière intervention 18 août 2008 - 6 janv. 2007 à 22:36
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 - 7 janv. 2007 à 06:20
Bonsoir,

Je cherche a realise une allocation memoire importante (dans les 200 Mo) j'utilises pour cela l'operateur new.
Cependant je me pose la question suivante : "Si j'alloue avec new le GC va finir un jour ou l'autre par mettre son nez dans mon alloc dans ce cas va t-il liberer le bloc memoire que j'aurai precedemment allouer ?"

Je cherche aussi si possible un autre moyen que les blocs try / catch pour m'assurer que j'ai bien allouer mon bloc memoire.
Pour le moment j'utilises :

byte[] buf = null;
try
{
buf = new byte[200 * 1024 * 1024];
// allocation reussi
}
catch (OutOfMemory e)
{
// erreur d'allocation
}

devrai-je plutot passer par l'api Win32 et ses fonctions VirtualAlloc ?

Merci d'avance,

2 réponses

cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
7 janv. 2007 à 01:16
Bonsoir,
Une piste: fixed -> exemple

++
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
7 janv. 2007 à 06:20
Salut, le GC ne va rien libérer du moment que tu maintiens une référence valide sur ton bloc mémoire, c-à-d tant que la variable 'buf' est accessible dans ton code. Même une fois la référence invalide le GC ne libère pas la mémoire immédiatement mais vu la taille de ton bloc ça devrait pas tarder. Avec new faut catcher l'exception OutOfMemory mais 'buf' sera aussi null si l'allocation plante. Si tu veux passer par l'API Win32 et allouer donc de la mémoire non managée, c-à-d non déplacée par le GC et non detruite par le GC, utilises la fonction Marshal.AllocHGlobal ou Marshal.AllocCoTaskMem ainsi que leur méthode respectives pour libérer le tas, faut vraiment pas oublier de liberer cette mémoire à la fin du traitement, ( voir Dispose et Destructeur de classe ). Pour manipuler cette mémoire sur la tas non managé tu as toute une serie de fonctions dans la classe Marshal ou si les performance sont importantes utilises les pointeur comme en C/C++ mais dans un bloc unsafe.
0
Rejoignez-nous