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

C++ Discussion :

Problème de libération de la mémoire virtuelle


Sujet :

C++

Mode arborescent

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Février 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2013
    Messages : 7
    Par défaut Problème de libération de la mémoire virtuelle
    Bonjour à tous,

    Mon problème est le suivant.
    J'ai réalisé une application en C++ sous Visual Studio 10 sous windows XP 32bit.
    Cette application doit créer une quantité très importante d'objets en mémoire de petite taille (environ 20 Ko).
    J'ai donc ajouté à mon code un bloc try/catch pour intercepter les dépassements mémoires.
    Lorsque l'occupation mémoire atteint 2Go, les allocations échouent. Une exception est générée. L'application la capture et libère la mémoire.
    L'objectif est de pouvoir gérer ces situations et garder la stabilité de l'appli.
    Or il semble qu'après avoir libérer toutes les ressources allouées par l'application, la mémoire virtuelle n'est pas libérée.
    En utilisant la fonction GlobalMemoryEx(), on s'apperçoit que la mémoire disponible n'est que de quelques méga.
    Il est ensuite impossible de réallouer un espace mémoire de plus d'une dizaine de méga.

    Pour mieux comprendre voici un code d'exemple reproduisant le problème :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    // AllocationErr.cpp : définit le point d'entrée pour l'application console.
    //
     
    #include "stdafx.h"
    //#include <iostream.h> 
    #include <vector> 
    #include "AllocationErr.h"
     
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
     
    using namespace std;
     
    void ReportMemory()
    {
    	MEMORYSTATUSEX statex;
     
    	statex.dwLength = sizeof (statex);
    	GlobalMemoryStatusEx (&statex);
     
    	HANDLE heap = GetProcessHeap();
    	SIZE_T size =  HeapCompact(heap, 0);
     
    	BOOL validated = HeapValidate(heap, 0, NULL);
     
    	TRACE("GlobalMemoryStatusEx:\n");
    	TRACE(" + TotalVirtual : %0.1lf Mo\n", statex.ullTotalVirtual / (1024.0 * 1024.0));
    	TRACE(" + AvailVirtual : %0.1lf Mo\n", statex.ullAvailVirtual / (1024.0 * 1024.0));
    	TRACE(" + Process mem load : %0.1lf %%\n", (1.0 - (double) statex.ullAvailVirtual / (double) statex.ullTotalVirtual) * 100.0);
    	TRACE(" + TotalPageFile : %0.1lf Mo\n", statex.ullTotalPageFile / (1024.0 * 1024.0));
    	TRACE(" + AvailPageFile : %0.1lf Mo\n", statex.ullAvailPageFile / (1024.0 * 1024.0));
    }
     
    int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
    {
        TRACE("Before allocation\n");
        ReportMemory();
     
        const unsigned int taille_bloc = 10* 1024, nb_blocs_max = (3U * 1024U * 1024U * 1024U / taille_bloc);
        int i = 0;
     
        char ** p = NULL;
     
        try
        {
            p = new char *[nb_blocs_max];
     
            memset(p, 0, nb_blocs_max * sizeof(char *));
     
            for(i = 0; i < nb_blocs_max; i++)
            {
                p[i] = new char[taille_bloc];
            }
        }
        catch (CMemoryException* e)
        {
            e->Delete();
     
            TRACE("After the program ran out of memory\n");
            ReportMemory();
     
            for(i = 0; i < nb_blocs_max; i++)
            {
                if(p[i])
                {
                    delete [] p[i];
                }
            }
     
            delete [] p;
        }
     
        TRACE("After freeing memory\n");
        ReportMemory();
     
        char * t = NULL;
        try
        {
            const unsigned int taille_max = 30 * 1024 * 1024;
            t = new char[taille_max];
        }
        catch (CMemoryException* e)
        {
            TRACE("Memory allocation failed\n");
            e->Delete();
     
            if(t)
            {
                delete [] t;
            }
        }
     
        return 0;
    }

    Le résultat afficher est le suivant :

    Before allocation
    GlobalMemoryStatusEx:
    + TotalVirtual : 2047.9 Mo
    + AvailVirtual : 2016.8 Mo
    + Process mem load : 1.5 %
    + TotalPageFile : 5198.6 Mo
    + AvailPageFile : 3172.9 Mo

    After the program ran out of memory
    GlobalMemoryStatusEx:
    + TotalVirtual : 2047.9 Mo
    + AvailVirtual : 4.5 Mo
    + Process mem load : 99.8 %
    + TotalPageFile : 5198.6 Mo
    + AvailPageFile : 1155.2 Mo

    After freeing memory
    GlobalMemoryStatusEx:
    + TotalVirtual : 2047.9 Mo
    + AvailVirtual : 5.7 Mo
    + Process mem load : 99.7 %
    + TotalPageFile : 5198.6 Mo
    + AvailPageFile : 3170.8 Mo


    Avez vous une idée ?
    Vous trouverez également en pièce jointe le projet Visual 10 ...
    Fichiers attachés Fichiers attachés

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de libération de la mémoire dans une fonction
    Par ArnaudFu1 dans le forum Débuter
    Réponses: 2
    Dernier message: 23/02/2012, 16h21
  2. [C] [libxml] problème de libération de la mémoire
    Par radouane_as dans le forum XML
    Réponses: 3
    Dernier message: 16/01/2008, 10h58
  3. [Debutant(e)]problème de libération de mémoire
    Par skywalker3 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 10/02/2005, 17h38
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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