Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 13 su 13
  1. #11
    Originariamente inviato da adrycast
    @Iolide
    Come avevamo previsto il controllo sulle deallocazioni dei distruttori non dà problemi. Anche qui resta sempre il messaggio di invalid pointer..


    Aspetta.
    Il controllo lo devi fare per vedere se devi deallocare o no.

    Devi fare una cosa del genere in tutti i distruttori:

    codice:
    if (attributo != 0)
    delete attributo (o delete [] attributo)
    L'hai fatto così ?
    Potresti ripostare il codice aggiornato all'ultima modifica così lo provo anch'io ora che ho un compilatore con me

    Originariamente inviato da adrycast
    Grazie per le risposte e per lo sbattone di leggervi i vari pezzi di codice ragazzi
    np
    lolide
    Java Programmer

    Informati

  2. #12
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Originariamente inviato da adrycast
    @shodan
    Guarda le 3000 allocazioni sono per esercizio, come ad esempio 4 costruttori fatti per la classe Animali e poi ne uso sempre solo uno. Semplicemente ho un esame e faccio 10000 cose futili ai fini logici ma utili per farmi prendere la mano ad allocare e deallocare (ed infatti dealloco praticamente tutto..)
    Non discuto le tue motivazioni: discuto il come lo fai.
    Il problema non sono i 4 costruttori o le 3000 allocazioni: il punto è dove e come le fai.
    Esempio:
    codice:
    Animali::Animali(const char N[], const float & e ) {
    	nome=new char[strlen(N)+1];
    	strcpy(nome,N);
    	eta=e;
    }
    Il costruttore base è questo.
    Cane lo richiama attraverso il suo costruttore.
    Ora se decidi di inserire un nuovo nome, che succede? Non perdi la memoria del vecchio puntatore?
    La soluzione è di inserire il nome nel costruttore attraverso la setNome() (ovviamente cambiando il prototipo). Stesso discorso per setEta() e per tutte le classi derivate. Fai in modo di avere un singolo punto di allocazione, non tanti sparsi nelle funzioni. Così se qualcosa va storto sai dove andare a guardare.

    codice:
    Animali::Animali(const char N[], const float & e ) : nome(NULL), eta(0) {
    	setNome(N);
    	setEta(e);
    } 
    
    //funzioni per nome
    void setNome(const char N[]) {
    	if (nome == NULL) nome=new char[strlen(N)+1];
    	strcpy(nome,N);
    }
    void setEta(const float & e) { eta = e; }
    In questo modo puoi creare tutti i costruttori che ti servono.

    Tuttavia il punto da tenere presente è:
    codice:
    Animali::Animali(const char N[], const float & e ) :nome(NULL) , eta(0) {
    vale a dire annullare tutti i puntatori nei costruttori, in modo che se non usati esplicitamente sia safe fare una delete su di loro.
    Quindi tutti i costruttori (di tutte le classi) devono avere nella inizialization list, l'annullamento dei puntatori di loro competenza.
    codice:
    Cane (const char N[],const float & eta): Animali(N,eta), pelo(NULL), razza(NULL) {}
    Per quanto riguarda l'input, la funzione da usare è:
    codice:
    cin.getline(N,19);
    invece dopo un inserimento numerico è opportuno mettere:
    codice:
    cin.ignore(LONG_MAX,'\n');
    in modo da evitare che il newline rimanga nel buffer, interferendo con l'input.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #13
    Originariamente inviato da shodan
    Non discuto le tue motivazioni: discuto il come lo fai.
    Il problema non sono i 4 costruttori o le 3000 allocazioni: il punto è dove e come le fai.
    Esempio:
    codice:
    Animali::Animali(const char N[], const float & e ) {
    	nome=new char[strlen(N)+1];
    	strcpy(nome,N);
    	eta=e;
    }
    Il costruttore base è questo.
    Cane lo richiama attraverso il suo costruttore.
    Ora se decidi di inserire un nuovo nome, che succede? Non perdi la memoria del vecchio puntatore?
    La soluzione è di inserire il nome nel costruttore attraverso la setNome() (ovviamente cambiando il prototipo). Stesso discorso per setEta() e per tutte le classi derivate. Fai in modo di avere un singolo punto di allocazione, non tanti sparsi nelle funzioni. Così se qualcosa va storto sai dove andare a guardare.

    codice:
    Animali::Animali(const char N[], const float & e ) : nome(NULL), eta(0) {
    	setNome(N);
    	setEta(e);
    } 
    
    //funzioni per nome
    void setNome(const char N[]) {
    	if (nome == NULL) nome=new char[strlen(N)+1];
    	strcpy(nome,N);
    }
    void setEta(const float & e) { eta = e; }
    In questo modo puoi creare tutti i costruttori che ti servono.

    Tuttavia il punto da tenere presente è:
    codice:
    Animali::Animali(const char N[], const float & e ) :nome(NULL) , eta(0) {
    vale a dire annullare tutti i puntatori nei costruttori, in modo che se non usati esplicitamente sia safe fare una delete su di loro.
    Quindi tutti i costruttori (di tutte le classi) devono avere nella inizialization list, l'annullamento dei puntatori di loro competenza.
    codice:
    Cane (const char N[],const float & eta): Animali(N,eta), pelo(NULL), razza(NULL) {}
    Per quanto riguarda l'input, la funzione da usare è:
    codice:
    cin.getline(N,19);
    invece dopo un inserimento numerico è opportuno mettere:
    codice:
    cin.ignore(LONG_MAX,'\n');
    in modo da evitare che il newline rimanga nel buffer, interferendo con l'input.

    Ti ringrazio, veramente molto chiaro.
    Devo confessare di aver pensato al richiamo dei set nel costruttore perchè anche a me sembrava la miglior soluzione ma il compilatore mi dava errore, di fatti non le avevo implementate come hai fatto tu.

    Comunque volevo scusarmi per non aver risposto in questi giorni, purtroppo il mio computer si è momentaneamente fritto e non potendo perder tempo a ripararlo (ad inizio settimana ho due esami in due giorni..) mi sono fatto prestare il portatile dalla mia ragazza ieri sera e dunque più tardi o domani proverò le modifiche che mi ha suggerito shodan e cercherò di farvi sapere.
    "Science is a differential equation.
    Religion is a boundary condition."
    (Alan Touring)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.