[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [HS] mauvaise gestion mémoire sous Linux



Aurélien Campéas wrote:
Le programme C++ suivant :

#include <iostream>

int main ()
{
    long taille;
    int * pint;
    int nbloc;
    cout<<"Taille de bloc : ";
    cin>>taille;
    for (nbloc = 1; ; nbloc++) {
        pint = new int[taille];
        if (pint)
            cout<<"Alloc bloc n°"<<nbloc<<endl;
        else {
            cout<<"Alloc impossible";
            break;
        }
    }
}

...engendre invariablement le message "Alloc impossible" sous AIX, qqsoit la taille de bloc, lorsque le système a épuisé les ressources mémoire.
Sous Linux, en fonction de la taille de bloc demandée, on a un message
"Abort"
ou bien
"Segmentation fault"
mais JAMAIS "Alloc impossible"...

Ca m'a vraiment surpris quand je l'ai découvert...
De loin, ça ressemble à une faiblesse, parceque ça va être dur d'implémenter une gestion d'exception sur les capacités mémoire.
Haureusement que ça ne concerne que peu d'applis...
C'est peu-être AUSSI un pb. dans la façon dont le compilateur C++ (xlC dans le cas d'AIX, g++ pour Linux) implémente la fonction "new".
Ce genre de choses ne devrait pas se produire.


C'est normal qu'un Abort soit généré. Il correspond à la non gestion d'une exception levée par l'échec de new.
new lève une exception du type bad_alloc (#include <new>)


Pour éviter la levée d'une exception et forcer la gestion via un if, il faut passer nothrow en argument à new. Le code ci-dessus passe très bien avec un new(nothrow) ou un try{new ... } catch(bad_alloc) {...}


Stéphane

--
In space, no one can hear you fart.



Reply to: