Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C/C++] Dubbi su definizione di oggetto.

    Che diffenenza c'è tra queste 2 forme di definizione?

    Oggetto oggetto;
    oggetto.numero= 1;

    Oggetto *oggetto= new Oggetto();
    oggetto->numero= 1;

    Grazie mille, Denis.

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    746
    il primo è una variabile (automatica) allocata staticamente:
    la memoria occupata non viene liberata finchè non esci dalla funzione
    o dal blocco

    il secondo è un puntatore dinamico ad una locazione di memoria:
    in questo caso, oggetto punta all'indirizzo ritornato
    da new Oggetto();

    codice:
    Es.
    
    Oggetto obj;
    Oggetto *ptr;
    
    obj.numero = 1;
    ptr = &obj;
    ptr->numero = 2;
    cout << "obj: " << obj.numero << ", ptr: " << ptr->numero << endl;
    obj.numero = 3;
    cout << "obj: " << obj.numero << ", ptr: " << ptr->numero << endl;

  3. #3
    A però.

    Per cui

    Oggetto oggetto;
    oggetto.numero= 1;

    al termine della funzione la memoria viene liberata in automatico mentre

    Oggetto *oggetto= new Oggetto();
    oggetto->numero= 1;

    al termine della funzione la memoria rimane occupata e si richiede l'uso del comando 'delete'.

    Mi rimane da capire cosa serva '&'.

  4. #4
    serve perchè un puntatore deve pur sempre puntare ad un indirizzo!
    quindi a ptr (che nota non è dereferenziato quindi non chiede un valore ma un indirizzo!)
    assegni l'indirizzo dell'oggetto tramite la sintassi: &obj

  5. #5
    & lo usi come passaggio di una variabile per riferimento e nn per valore(dunque è un altro metodo).
    E' leggermente diverso da quest'ultimo, poichè è più veloce(nn si nota ovviamente) in quanto nn fa una copia della variabile e ci accede direttamente.
    Il tutto detto in poche parole.
    A livello pratico cambia anche qualcosina, il valore della variabile passata per riferimento prende cm valore quello creato da una funzione e questo valore rimane tale anche all'uscita della funzione, quindi in fase 'pop' dello stack (si dice cosi, se nn sbaglio).

    Ciao
    A liv
    Sistemi di allarme, telecamere, autoradio, video proiettori e altri prodotti tecnologici: fedom.it

  6. #6
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Bisogna ricordare che coi puntatori la memoria non viene liberata, ma il puntatore si, quindi state attenti.

    codice:
    void Block()
    [
        MioObj obj = new MioObj();
    ]
    In questo caso come vedete non abbiamo liberato la memoria, quindi questa resta occupata, ma il puntatore va perso, quindi niente piu' punta alla memoria e quindi non può piu' essere liberata
    La memoria è stata sprecata, o meglio, si è avuto un memory leak.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

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