[C++] Mémoire dispo

Résolu
Omega_55 -  
mamiemando Messages postés 33769 Date d'inscription   Statut Modérateur Dernière intervention   -
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 33769 Date d'inscription   Statut Modérateur Dernière intervention   7 879
 
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