PDA

View Full Version : [C++] Help Distruttori


lycenhol
31-03-2009, 15:29
Ho un problema in C++ con il seguente codice:


#include <iostream>

using namespace std;

const unsigned int num_int = 30;

class Calcolus {
float* int_tab;
public:
Calcolus();
~Calcolus();
void set_int(unsigned int,float);
float get_int (unsigned int);
};

Calcolus::Calcolus(){
if(int_tab==NULL){
int_tab=(float*)malloc(sizeof(float)*num_int);
}
}

Calcolus::~Calcolus(){
}

void Calcolus::set_int (unsigned int ind, float val){
if (ind<num_int){
if (int_tab==NULL)
int_tab=(float*)malloc(sizeof(float)*num_int);
int_tab[ind]=val;
}
}

float Calcolus::get_int (unsigned int ind){
float result;
if (ind>=num_int)
return 0;
if (int_tab==NULL)
return 0;
result=int_tab[ind];
return result;
}

int main()
{
Calcolus Prova;
Prova.set_int(1, 0.05);
Prova.set_int(2, 0.07);
cout << Prova.get_int(0) <<endl;
cout << Prova.get_int(1) <<endl;
cout << Prova.get_int(2) <<endl;
return 0;
}


Nell'esempio il compilatore MinGW mi da errore, per la presenza del distruttore, anche se non fa nulla. Se tolgo il distruttore il tutto funziona.
Nella versione finale il distruttore dovrà eliminare int_tab con free, e in aggiunta tutti gli altri pointer che devo andare ad aggiungere.

Altri esempi presi da Internet, ma analoghi funzionano.

MAXIMOfw
31-03-2009, 19:56
Ho un problema in C++ con il seguente codice:


#include <iostream>

using namespace std;

const unsigned int num_int = 30;

class Calcolus {
float* int_tab;
public:
Calcolus();
~Calcolus();
void set_int(unsigned int,float);
float get_int (unsigned int);
};

Calcolus::Calcolus(){
if(int_tab==NULL){
int_tab=(float*)malloc(sizeof(float)*num_int);
}
}

Calcolus::~Calcolus(){
}

void Calcolus::set_int (unsigned int ind, float val){
if (ind<num_int){
if (int_tab==NULL)
int_tab=(float*)malloc(sizeof(float)*num_int);
int_tab[ind]=val;
}
}

float Calcolus::get_int (unsigned int ind){
float result;
if (ind>=num_int)
return 0;
if (int_tab==NULL)
return 0;
result=int_tab[ind];
return result;
}

int main()
{
Calcolus Prova;
Prova.set_int(1, 0.05);
Prova.set_int(2, 0.07);
cout << Prova.get_int(0) <<endl;
cout << Prova.get_int(1) <<endl;
cout << Prova.get_int(2) <<endl;
return 0;
}


Nell'esempio il compilatore MinGW mi da errore, per la presenza del distruttore, anche se non fa nulla. Se tolgo il distruttore il tutto funziona.
Nella versione finale il distruttore dovrà eliminare int_tab con free, e in aggiunta tutti gli altri pointer che devo andare ad aggiungere.

Altri esempi presi da Internet, ma analoghi funzionano.

il compilatore alla fine del programma invoca automaticamente un suo distruttore per liberare la memoria occupata(distruttore implicito), vedendo però la dichiarazione di un distruttore lui capisce che all'atto di distruzione dovrà invocare QUEL distruttore e non quello implicito, esso però non contiene alcuna azione da eseguire e quindi il compilatore si incazza credo:)
quando ho seguito programmazione c++, mi pare che il prof ci abbia detto che il distruttore, se dichiarato, va sempre definito
comunque sia la cosa importante è una: è inutile dichiarare un distruttore se poi non viene specificata alcuna operazione associata ad esso, in tal caso basta il distruttore default del compilatore

lycenhol
01-04-2009, 08:50
Grazie della risposta.

Il distruttore implicito infatti funziona.

Se lo esplicito, sia che gli definisca dentro qualcosa, sia che gli inserisca free(int_tab) mi da errore e il programma crasha all'avvio.

gbhu
01-04-2009, 17:09
Credo che l'errore sia nel check
if(int_tab==NULL)
infatti per i campi non statici non avviene l'inizializzazione a NULL. Occore inizializzare l'attributo esplicitamente.
Che io sappia il distruttore non crea alcun problema per il fatto di essere definito "vuoto".
Inoltre comunque direi che non è tanto carino allocare un array in quel modo.
Sarebbe più pulito un "new float[num_int]" e poi "delete [] int_tab".

lycenhol
02-04-2009, 13:42
Credo che l'errore sia nel check
if(int_tab==NULL)
infatti per i campi non statici non avviene l'inizializzazione a NULL. Occore inizializzare l'attributo esplicitamente.
Che io sappia il distruttore non crea alcun problema per il fatto di essere definito "vuoto".
Inoltre comunque direi che non è tanto carino allocare un array in quel modo.
Sarebbe più pulito un "new float[num_int]" e poi "delete [] int_tab".

Grazie, hai ragione, è proprio questo l'errore! :doh:
Ti ringrazio per la risposta :D