[RISOLTO]unique_ptr

di il
5 risposte

[RISOLTO]unique_ptr

Ho questo codice:

int a = 5;
std::unique_ptr<int> p(new int);
p = std::make_unique<int>(std::move(a));
Come posso sapere a quale indirizzo sta puntando p?

5 Risposte

  • Re: [RISOLTO]unique_ptr

    PiraLezz ha scritto:


    Ho questo codice:
    
    int a = 5;
    std::unique_ptr<int> p(new int);
    p = std::make_unique<int>(std::move(a));
    
    Come posso sapere a quale indirizzo sta puntando p?
    Dovresti usare il metodo std::unique_ptr::get
    
    std::unique_ptr<int> p(new int);
    p = std::make_unique<int>(std::move(a));
    
    int *pAddr = p.get();
    
    Per ulteriori riferimenti:
    • -
  • Re: [RISOLTO]unique_ptr

    Questo è il codice che utilizzo:
    
    std::string prova = "testo";
    std::unique_ptr<std::string> s_p(new std::string);
    s_p = std::make_unique<std::string>(std::move(prova));
    
    std::cout << s_p.get() << std::endl;
    std::cout << &prova << std::endl;
    std::cout << &s_p << std::endl;
    
    std::cout << *s_p << "-" << prova << std::endl;
    
    E l'output è questo:
    00580DA0
    0018F96C
    0018F960
    testo-
    Ma forse ora ho capito, in quanto non possono esserci due puntatori che puntano alla zona di memoria di s_p e quindi per forza di cose prova e s_p hanno zone di memoria differenti. Mi confermi? (il libro che sto leggendo non è molto chiaro su questo)
  • Re: [RISOLTO]unique_ptr

    PiraLezz ha scritto:


    Questo è il codice che utilizzo:
    
    std::string prova = "testo";
    std::unique_ptr<std::string> s_p(new std::string);
    s_p = std::make_unique<std::string>(std::move(prova));
    
    std::cout << s_p.get() << std::endl;
    std::cout << &prova << std::endl;
    std::cout << &s_p << std::endl;
    
    std::cout << *s_p << "-" << prova << std::endl;
    
    E l'output è questo:
    00580DA0
    0018F96C
    0018F960
    testo-
    Ma forse ora ho capito, in quanto non possono esserci due puntatori che puntano alla zona di memoria di s_p e quindi per forza di cose prova e s_p hanno zone di memoria differenti. Mi confermi? (il libro che sto leggendo non è molto chiaro su questo)

    Trovi le modifiche al codice nei commenti del codice in basso :
    	
    	// Ora prova e' un puntatore  e per accedere al valore occorre *
    	std::string* prova = new std::string("testo"); //con la new viene creato sull'heap l'oggetto e non sullo stack.
    									
    	std::unique_ptr<std::string> s_p(prova); //assegni il puntatore al costruttore
    	
    	//s_p = std::make_unique<std::string>(std::move(prova)); //non occorre
    
    	std::cout << *s_p.get() << std::endl; //qui ci vuole l'operatore * altrimenti stampi l'indirizzo non il valore
    	std::cout << prova << std::endl; //stampi indirizzo (prova e' un puntatore)
    	std::cout << s_p.get() << std::endl; // ottieni indirizzo racchiuso in s_p
    
    	//Con le modifiche sopra ora le due stampe ti danno lo stesso indirizzo 
    	
    	//modifichiamo valore
    	*prova = "new";
    	//stampano lo stesso valore perché si tratta della stessa area di memoria, quella creta con la new iniziale.
    	std::cout << *s_p << "-" << *prova << std::endl; // qui l'operatore * va bene perché accedi al valore e non all'inidirizzo
    	
    	
    Anche se per il codice di sopra non ha molto senso l'uso di unique_ptr.
  • Re: [RISOLTO]unique_ptr

    Ok, ora ho capito . Grazie mille per il tuo tempo e disponibilità!!
  • Re: [RISOLTO]unique_ptr

    PiraLezz ha scritto:


    Ok, ora ho capito . Grazie mille per il tuo tempo e disponibilità!!
    Per chiarezza, dato che hai usato unique_ptr in un contesto inusuale, tieni in mente che unique_ptr fa parte della famiglia degli smartpointer introdotti con lo standard C++11. Viene usato principalmente per dare il "potere" di usare un puntatore solo ad una variabile unique_ptr, inoltre permette di deallocare le risorse a cui punta il puntatore passato ad unique_ptr in modo da evitare memory leak.

    Vedi il codice seguente:
    
    std::string* prova = new std::string("testo"); 
    std::unique_ptr<std::string> s_p(prova);
    std::cout << "s_p before : I manage the pointer: " <<*s_p << std::endl;
    
    //s_p non ha alcun puntatore assegnato
    	std::unique_ptr<std::string> s_p2;  
    
    if (s_p2.get() == nullptr)
    	std::cout << "s_p2 before : Manage nothing..." << std::endl;
    
    //passa la proprieta' del puntatore prova da s_p ad s_p2
    	s_p2 = std::move(s_p); //assegni la proprietà del puntatore 'prova' a s_p2
    	
    if (s_p2.get() != nullptr)
    	std::cout << "s_p2 after: I manage the pointer: " << *s_p2 << std::endl;
    
    if (s_p.get() == nullptr)
    	std::cout << "s_p after : I not manage the pointer!!!\n";
    else
    	std::cout << "s_p after : I still manage the pointer:\n" << *s_p << std::endl;
    Questo è un esempio di passaggio di "proprietà" del puntatore prova. Ti assicuri che solo uno degli smartpointer gestisce quel puntatore e sarà delegato a liberare la memoria associata ad esso.
Devi accedere o registrarti per scrivere nel forum
5 risposte