Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563

    C++ - Differenza tra semplice instanza e puntatore

    Supponiamo di avere la classe Cronometro, che ha due metodi: inizia, stop, il membro privato tempo e la funzione getTime
    Ora nel mio programma faccio
    codice:
    Cronometro Crono;
    Crono.Start();
    //Altri codice...
    Crono.Stop();
    cloc_t Time = Crono.GetTime();
    Fin qui tutto bene. Lo stesso codice può ovviamente essere fatto coi puntatori

    codice:
    Cronometro *Crono;
    Crono->Start();
    //Altri codice...
    Crono->Stop();
    cloc_t Time = Crono->GetTime();
    Ora, la differenza tra i due quale è?
    Prendiamo ad esempio il motore grafico Irrlicht: per usare la classe principale si fa
    codice:
    IrrlichtDevice *device = CreateDevice(...);
    Perchè si devoon usare i puntatori? Non va bene anche
    codice:
    IrrlichtDevice device = CreateDevice(...);
    La stessa cosa con le DirectX (Direct3D).
    Perchè devo usare IDirect3D9 *g_pD3D e non una semplice istanza? E' un dubbio che mi frulla in testa da molto

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Se scrivi

    Cronometro Crono;
    Crono.Start();

    va bene ma se scrivi

    Cronometro *Crono;
    Crono->Start();

    commetti un errore (grave ma classico di chi sta imparando ...) perche' il puntatore non e' *inizializzato* ...

    Cioe', prima di chiamare il metodo, ti devi assicurare che il puntatore *punti effettivamente* ad un oggetto che *esiste* ...

    Il codice corretto, dovrebbe essere

    Cronometro *Crono;
    Crono = new Cronometro();
    Crono->Start();

    In piu', alla fine dell'utilizzo dell'oggetto, dovresti usare la

    delete Crono;

    per chiamare il distruttore, che nell'altro caso, sarebbe chiamato automaticamente quando l'oggetto esce dallo scope.

    Nel caso di

    IrrlichtDevice *device = CreateDevice(...);

    non tieni in considerazione il fatto che la funzione CreateDevice, sicuramente, restituisce un "puntatore ad oggetto IrrlichtDevice" e quindi, dall'altra parte, ci deve essere un puntatore a tale oggetto.

  3. #3
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Giustamente io devo allocare la memoria per avere il cronometro pronto e poi eliminarlo con delete. Cosi mi sta bene. Togliamo IrrlichtDevice perchè hai ragione,restituisce un puntatore e non ci avevo proprio pensato.
    Ma nel primo caso, perchè usare *Crono e non Crono, o viceversa? Ci sono vataggi nell'usare un puntatore?

    Da come ho letto sopra, quindi ogni volta si deve inizializzare il puntatore.
    codice:
    Cronometro *Crono = new Cronometro;
    E fin qui, ok. Ma allora perche cosi va bene?
    codice:
    int *a  = 10;
    Avviene un'allocazione automatica??

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Il fatto di usare un oggetto o un puntatore ad un oggetto, come nel caso di tutti gli altri tipi di dati messi a disposizione, dipende dalle esigenze che hai.

    Se devi allocare un numero di oggetti che dipende dall'input dell'utente, cosa utilizzi?

    Per quanto riguarda l'esempio

    int *a = 10;

    e' un altro errore grave (!) ... e il compilatore non ti dovrebbe permettere tale scrittura.

    Stai tentando di impostare il valore di un puntatore, e questo e' una cosa senza senso. Come fai a sapere che "l'indirizzo di memoria 10" conterra' un intero? O forse non hai ben chiaro che quel 10 che hai scritto rappresenta "l'indirizzo in memoria" di un dato?

    Quello che puoi correttamente scrivere e'

    int x;
    int *a = &x;

    oppure

    int *a = new int;

    e capirai le differenze con quello che hai scritto ...

  5. #5
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Avevi ragione...
    il codice giusto è
    codice:
    int *a = new int;
    *a = 10;
    delete a;
    In definitiva, ogni puntatore deve essere prima inizializzato allocando la memoria che gli serve.
    Ora queste cose sui puntatori mi sono piu' chiare. Thank you!
    Ora che ci penso
    codice:
    int *a = new char;
    Cosa succede? Allochi una quantità sbagliata?
    In C invece si faceva cosi, giusto?
    codice:
    int *a = malloc ( sizeof( int ) );
    Mettiamo caso che sono pazzo, voglio fare un programma che allochi tutta la memoria del pc e quindi lo faccio bloccare.
    Come si deve fare?

    codice:
    void *a = malloc ( 1023982109382109380913821 );
    Una cosa cosi può andare bene?

    Altra domanda...
    Il garbage collector di java e c# gestiscono in automatico la memoria e la liberano ogni volta che tutti i riferimenti a un oggetto scompaiono. Ho sentito che anche il C++ si può dotare di un Garbage Collector...sapete dove e come?
    Come funziona il garbage collector?
    Un esempio di codice?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da XWolverineX
    Ora che ci penso
    codice:
    int *a = new char;
    Cosa succede? Allochi una quantità sbagliata?
    Hai provato?

    Il compilatore ti da' un errore in fase di compilazione ...
    Originariamente inviato da XWolverineX
    In C invece si faceva cosi, giusto?
    codice:
    int *a = malloc ( sizeof( int ) );
    Quasi ... per essere precisi, dato che il tipo di puntatore restituito dalla malloc e' void, devi scrivere

    int *a = (int *)malloc(sizeof(int));
    Originariamente inviato da XWolverineX
    Mettiamo caso che sono pazzo, voglio fare un programma che allochi tutta la memoria del pc e quindi lo faccio bloccare.
    Come si deve fare?

    codice:
    void *a = malloc ( 1023982109382109380913821 );
    Una cosa cosi può andare bene?
    Nel caso in cui la malloc non possa restituire la quantita' di memoria richiesta, restituisce un valore NULL da cui ti accorgi che l'operazione e' fallita.

    Se riesci ad allocare la memoria, vuol dire che questa era disponibile e quindi non "blocchi" il computer ...

    Semmai, tutti gli altri programmi avviati in seguito, daranno un errore se allocano memoria ...
    Originariamente inviato da XWolverineX
    Altra domanda...
    Il garbage collector di java e c# gestiscono in automatico la memoria e la liberano ogni volta che tutti i riferimenti a un oggetto scompaiono. Ho sentito che anche il C++ si può dotare di un Garbage Collector...sapete dove e come?
    Come funziona il garbage collector?
    Un esempio di codice?
    Un Garbage Collector e' un codice estremamente complesso.
    Non si puo' fornire un esempio in un post in un forum ...

  7. #7
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    E per impallare un pc rubandogli tutta la memoria disponibile, cosa si dovrebbe fare??

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non mi sembra una cosa interessante da farsi ...

  9. #9
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Non devo mica mettermi a fare il bastardo, voglio solo capire come funziona la situazione

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Beh, non e' per questo ma mi sembra inutile ....

    Comunque, alloca la memoria in un ciclo per porzioni piccole ...

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 © 2025 vBulletin Solutions, Inc. All rights reserved.