What: bad_alloc

di il
7 risposte

What: bad_alloc

Salve a tutti ragazzi, sto implementando questo esercizio di esame di Programmazione a Oggetti, ho un problema molto strano, il programma compila il tutto ma poi quando lo eseguo, mi restituisce "Windows ha smesso di funzionare" ed eclipse mi restituisce questo errore what:: std bad_alloc..

A cosa è dovuto?
Consigli, soluzioni,migliorie al codice,critiche è tutto ben accettato... Grazie a tutti in anticipo...
Vi allego i file del mio esercizio...


#include <iostream>
#include <vector>
#include <list>
#include<cstdlib>
#include <algorithm>
#include <string>
#include<string.h>
#include"Studente.h"

#include <fstream>
using namespace std;

int main() {

list<Studente> lista1;
list<Studente> lista2;

ifstream file_ing1,file_ing2;

file_ing1.open("src/input1.txt",ios::in);

if(!file_ing1){
	cout<<"Non posso aprire il file.."<<endl;
	exit(-1);

}

file_ing1>>lista1;
file_ing1.close();


cout<<lista1<<endl;

}


/*
 * Studente.cpp
 *
 *  Created on: 09/gen/2015
 *      Author: jqr91
 */

#include "Studente.h"

Studente::Studente() {
	// TODO Auto-generated constructor stub

	nome="";
	cognome="";
	matricola="";


}

Studente::~Studente() {
	// TODO Auto-generated destructor stub



}

Studente::Studente(const Studente &s){
	nome=s.nome;
	cognome=s.cognome;
	matricola=s.matricola;

	esami.resize(s.esami.size());
	copy(s.esami.begin(),s.esami.end(),esami.begin());


}

bool Studente::operator ==(Studente &d){

	return matricola==d.matricola;
}

void Studente::setNome(string n){

	nome=n;

}
void Studente::setCognome(string c){
	cognome=c;
}
void Studente::setMatricola(string m){
	matricola=m;

}

string Studente::getNome(){

	return nome;
}


string Studente::getCognome(){
	return cognome;

}
string Studente::getMatricola(){

	return matricola;
}
void Studente::addEsame(int v){

	esami.push_back(v);


}
void Studente::clear(){
	esami.clear();

}

float Studente::mediaVoti(){

	float somma=0;
	for(int i=0;i<(int)esami.size();i++){

		somma=esami[i]+somma;


	}

	return somma/(float)esami.size();
}

ostream &operator<<(ostream &o,Studente &s){

	o<<" "<<s.nome<<" "<<s.cognome<<" "<<s.matricola<<" "<<endl;

	for(int i=0;i<(int)s.esami.size();i++){

            o<<s.esami[i]<<endl;
	}

	return o;
}


istream &operator>>(istream &in,Studente &s){
	int n_esami;
	string appoggio;
	in>>appoggio;
	s.setNome(appoggio);
	in>>appoggio;
	s.setCognome(appoggio);
	in>>appoggio;
	s.setMatricola(appoggio);
	in>>n_esami;
	s.esami.resize(n_esami);
	for(int i=0;i<n_esami;i++){
		in>>s.esami[i];

	}

	return in;
}


ostream &operator<<(ostream &out,list<Studente>&s){

	list<Studente>::iterator it1;
	it1=s.begin();

	while(it1!=s.end()){
		out<<*it1;
		it1++;

	}
return out;
}



istream &operator>>(istream &in,list<Studente>&s){

	Studente app;
	while(!in.eof()){
		in>>app;
		s.push_back(app);


	}
	return in;
}






/*
 * Studente.h
 *
 *  Created on: 09/gen/2015
 *      Author: jqr91
 */

#ifndef STUDENTE_H_
#define STUDENTE_H_
#include <iostream>
#include <vector>
#include <list>
#include<cstdlib>
#include <algorithm>
#include <string>
#include<string.h>

#include <fstream>
using namespace std;
class Studente {
private:

	      string      nome;
	      string      cognome;
	      string      matricola;
	      vector<int> esami;

public:
	      Studente();
	     virtual  ~Studente();

	     Studente(const Studente &s);
	      bool operator==(Studente &o);

	      friend ostream& operator<<(ostream &os, Studente &s);
	      friend istream& operator>>(istream &is, Studente &s);

	      // Funzioni SET
	      void setNome(string n);
	      void setCognome(string c);
	      void setMatricola(string m);

	      // Funzioni GET
	      string getNome();
	      string getCognome();
	      string getMatricola();

	      // Altre Funzioni
	      void addEsame(int v); // aggiunge un nuovo esame al vettore esami
	      void clear();         // azzera il vettore degli esami
	      float mediaVoti();    // calcola e restituisce la media dei voti








};


    ostream & operator<<(ostream &os,  list<Studente> &l);
	istream & operator>>(istream &is, list<Studente> &l);

	void elimina(list<Studente> &l, int s);
	// INPUT: una lista l e un intero s
	// OUTPUT: modifica la lista l  eliminando tutti gli elementi con una  media maggiore di s;

	float compMedia(const list<Studente> &l);
	// INPUT: una lista l
	// OUTPUT: restituisce il valore medio delle medie dei voti degli elementi contenuti nella lista l;



#endif /* STUDENTE_H_ */



Il mio file di testo è questo qui:

Mario, Molinara, 1250, 6 18 23 28 30 30 30
Francesco, Fontanella, 1251, 10 23 24 23 25 24 28 19 22 18 28
Claudio, De Stefano, 1252, 5 24 22 29 24 18
Claudio, Marrocco, 1258, 5 23 25 24 28 29

7 Risposte

  • Re: What: bad_alloc

    Std::bad_alloc è sollevata quando operator new non trova più memoria per allocare un oggetto nell'heap (cosa dura di questi tempi).
    Piuttosto il tuo problema immagino si verifichi alla terza riga del file. Infatti in
    
    istream &operator>>(istream &in,Studente &s){
       int n_esami;
       string appoggio;
       in>>appoggio; // occhio qui
       s.setNome(appoggio);
       in>>appoggio;
       s.setCognome(appoggio);
       in>>appoggio;
       s.setMatricola(appoggio);
       in>>n_esami;
       s.esami.resize(n_esami);
       for(int i=0;i<n_esami;i++){
          in>>s.esami[i];
       }
    
    usi l'operatore >> per leggere i dati, MA questo operatore per le stringhe si ferma al primo spazio.
    Ora la terza riga del file è
    Claudio, De Stefano, 1252, 5 24 22 29 24 18
    per cui in Nome hai Claudio, in Cognome hai De e in matricola hai Stefano. Di conseguenza quando leggi n_esami leggerai 1252 non 5.
    Prova a mettere De_Stefano e vedi se hai ancora l'errore.
  • Re: What: bad_alloc

    Ciao grazie per il consiglio, ma il problema penso l ho identificato, oltre ad essere quello e va corretto, il problema piu importante sta nell' overloading dell operatore >> per quanto riguarda la lista..Mi spiego meglio, quando va nel while(!in.eof()) mi da " permission denieded per il file.exe" .
    Non riesco a risolvere bene questa cosa, infatti i miei problemi sono in tutte e due gli overloading >> e non riesco a risolvere, o meglio non riesco a capire...
  • Re: What: bad_alloc

    Ho testato il codice con la modifica al file.txt suggerita e non ho problemi.
  • Re: What: bad_alloc

    Ciao, ho provato anche io e funge..ma ahimè non posso cambiare il file di testo perché il prof mi annulerebbe la prova..come risolvono?? Se metto un getline?
  • Re: What: bad_alloc

    Modifica così:
    
    #include <sstream>
    #include <locale>
    // toglie tutti gli spazi a sinistra
    string trim_left(const string& s, const std::locale& loc = std::locale()) {
    	if (s.empty()) return s;
    	auto bg = s.cbegin(); // string::iterator bg = s.begin()
    	auto ed = s.cend();    // string::iterator ed = s.end()
      while (bg != ed && std::isspace(*bg, loc)) ++bg;
      return string(bg, ed);
    }
    
    ... 
    
    istream &operator>>(istream &in, Studente &s) {
     	int n_esami;
     	string appoggio;
    	getline(in, appoggio);
    
    	istringstream iss(appoggio);
    	getline(iss, appoggio, ',');
    	s.nome = trim_left(appoggio);
    	getline(iss, appoggio, ',');
    	s.cognome = trim_left(appoggio);
    	getline(iss, appoggio, ',');
    	s.matricola = trim_left(appoggio);
    
    	iss >> n_esami;
    	s.esami.resize(n_esami);
    	for (int i = 0; i<n_esami; i++) {
    		iss >> s.esami[i];
    
    	}
    
    	return in;
    }
    
    
    Lo istringstream è necessario altrimenti sballa tutta la lettura dal file.
    Dato che l'operatore >> è friend ha poco senso (in questo contesto) non usare direttamente i dati membri.
    Se hai problemi con trim_left (specificatamente con la 2° e 3° istruzione dovrebbe essere sufficiente usare quelle commentate).
  • Re: What: bad_alloc

    Grazie, ti faccio sapere
  • Re: What: bad_alloc

    Sembra funzionare in maniera egregia :=) non mi restituisce neanche piu tutti zeri, quando appunto incontrava quel piccolo problema, del cognome separato!
Devi accedere o registrarti per scrivere nel forum
7 risposte