Problema chiamata distruttore

di il
9 risposte

Problema chiamata distruttore

Ciao a tutti, sono nuovo del forum, spero qualcuno possa aiutarmi, sto cercando di imparare il c++ e sono bloccato da diverse ore su questo code, il problema è che non viene chiamato il distruttore della classe MyString...qualcuno sa aiutarmi?

#include <iostream>
using namespace std;

class MyString{
	public:
		MyString(const char *str);
		~MyString();
		const char getChar (int i) const;
		void setChar(char c,int i);
		void debug(void);
		
	private :
		char *mpStr;
		int size;
};

MyString::MyString(const char *str){
	while(*(str+size) != '\0')
		size++;
	mpStr = new char[size];
	mpStr = strcpy(mpStr,str);
}

MyString::~MyString(){
	cout << "dealloco";
	
}

const char MyString::getChar (int i) const{
}
void MyString::setChar(char c, int i){
}

void MyString::debug(){
	for(int i = 0; i < size; i++)
		cout << mpStr[i];
	cout << endl;
}

int main(){
	MyString test("abcd");
	test.debug();
	return 0;
}
Il distruttore non dovrebbe essere chiamato in automatico al termine del main? Dove sbaglio?

9 Risposte

  • Re: Problema chiamata distruttore

    Come fai a vedere che non è chiamato? a main terminato non puoi avere l'accesso al cout. prova così
    
    int main(){
       MyString *test = new MyString("abcd");
       test->debug();
       delete test; //quì dovresti vedere il messaggio del destructor.
       return 0;
    }
    
    oppure
    
    int main()
    {
            {
               MyString test("abcd");
               test.debug();
             }//quì test va out of scope ma sempre dentro il main e dovresti vedere il messaggio del destructor.
       return 0;
    }
    
  • Re: Problema chiamata distruttore

    Grazie per la risposta, ho provato con il trucco dello scope ma la cout non viene fuori, con la delete il compilatore mi dice : "error: type ‘class MyString’ argument given to ‘delete’, expected pointer"
  • Re: Problema chiamata distruttore

    Piazza un breakpoint dentro il destructor e vedi se viene chiamato. Da me in tutti e due i modi viene chiamato il destructor. Il problema è un altro: la tua classe ha problemi di inizializzazione, hai dei new ma non vedo dei delete ecc.
  • Re: Problema chiamata distruttore

    I delete li avrei messi nel distruttore....ma non li ho ancora messi perchè appunto il distruttore mi sembrava non venisse chiamato, il distruttore diventerebbe :
    
    MyString::~MyString(){
       cout << "dealloco";
       delete[] mpStr; //editato
    }
    
    Cosa devo usare ber inserire un breakpoint?
    Non ho capito scusami...quindi da te funziona? vedi la cout?
  • Re: Problema chiamata distruttore

    Si vedo il cout. Non so il tuo compilatore qual'è ma se clicchi col mouse a sx della riga dove vuoi piazzare il breakpoint il programma si ferma lì durante l'esecuzione. (Nella riga compare un pallino rosso).
  • Re: Problema chiamata distruttore

    Su mac lo vedo e il codice funziona , ma su linux mi da segmentation fault su queste righe :
    
    while(*(str+size) != '\0')
          size++;
    
    presumo che centri il carattere di fine riga...già che siam qui ne sai qualcosa ?
    grazie mille per l'aiuto!
  • Re: Problema chiamata distruttore

    Si. size non è inizializato. Ho fatto delle piccole modifiche.
    
    #include <iostream>
    using namespace std;
    
    class MyString{
       public:
          MyString(const char *str);
          ~MyString();
          const char getChar (int i) const;
          void setChar(char c,int i);
          void debug(void);
          
       private :
          char *mpStr;
          int size;
    };
    
    MyString::MyString(const char *str)
    : size(0)
    , mpStr(NULL)
    {
    	while(*(str+size) != '\0')
          size++;
       size++;
       mpStr = new char[size];
       mpStr = strcpy(mpStr,str);
    }
    
    MyString::~MyString(){
       cout << "dealloco";
       delete [] mpStr;
    }
    
    const char MyString::getChar (int i) const{
    	return mpStr[i];
    }
    void MyString::setChar(char c, int i){
    	mpStr[i] = c;
    }
    
    void MyString::debug(){
       for(int i = 0; i < size; i++)
          cout << getChar(i);
       cout << endl;
    }
    
    int main()
    {
    	{
    		MyString test("abcd");
    		test.debug();
    	}
       return 0;
    }
    
    c'è ancora da migliorare ma così va un pò meglio.
  • Re: Problema chiamata distruttore

    Grazie mille ora funziona, proseguo con la classe.
  • Re: Problema chiamata distruttore

    Piccola modifica sul constructor. Avevo sbagliato sul size.
    
    MyString::MyString(const char *str)
    : size(0)
    , mpStr(NULL)
    {
       while(*(str+size) != '\0')
          size++;
        mpStr = new char[size+1];
       mpStr = strcpy(mpStr,str);
    }
    
Devi accedere o registrarti per scrivere nel forum
9 risposte