[C++] Mémoire dispo

Résolu/Fermé
Omega_55 - 5 août 2006 à 22:52
mamiemando Messages postés 32283 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 17 mars 2023 - 6 août 2006 à 21:57
Salut à tous,

Je me demande comment faire pour détecter la quantité de mémoire (physique, donc RAM) disponible.

Mon problème, c'est que j'instancie des objets qui font parfois plusieurs centaines de Mb. Alors si la mémoire physique n'est pas suffisante, j'aimerais pouvoir sortir un message d'erreur plutôt qu'un programme qui cesse simplement de travailler (en fenêtre dos, il ne se passe rien quand on tente d'instancier des éléments trop gros...).

Quelqu'un a-t-il une idée ? Moi j'ai rien trouvé sur Google. Merci d'avance

O.55

1 réponse

mamiemando Messages postés 32283 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 17 mars 2023 7 572
6 août 2006 à 21:57
Version C

Il suffit de contrôler le code de retour de malloc/calloc.
http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/malloc.3.html
Ne pas oublier le free associé au malloc/calloc.
http://www.manpagez.com/missing.php
extern "C" {
  #include <stdlib.h>
  #include <stdio.h>
}

void f(){
  char *plop = (char*)malloc(100000=sizeof(char));
  if (!plop){
    fprintf(stderr,"Pb allocation mémoire\n");
  }
  // je manipule plop
  // ...  
  // quand j'ai fini :
  free(plop);
}


Version C++

Si tu fais des new je pense que si le PC n'arrive plus à allouer il retourne un pointeur NULL. Ne pas oublier le delete associé.
Donc il suffit de calquer le raisonnement sur celui des malloc. Si tu instancies directement ton objet sans passer par un new ou un malloc/calloc le programme plantera au moment d'allouer avec un message d'erreur genre std bad alloc. Tu peux essayer de la rattraper avec un try catch, je ne sais pas si ça marche :
#include <iostream>
#include <vector>

class gros_truc{
  public:
  std::vector<double> plop;
  gros_truc(unsigned int i=0){
    plop = std::vector<double>(i);
  }
};

int main(){
  gros_truc g;
  try{
     g = gros_truc(10000000);
  }catch(...){
     std::cerr << "Pb allocation memoire" << std::endl;
  }
  return 0;
}

Bonne chance
1