Ritorno di un valore e il reference

di Anonimizzato20081 il
6 risposte
Ciao a tutti

Sapete cosa cambia nel mettere o non mettere il reference affianco alla funzione?
Poiche sia 'a' che 'b' diventano pari a 10 sto ritornando in entrambi i casi un valore?

#include <iostream>
using namespace std;

int f(){
    int a=10;
    int *v;
    v=&a;
    return *v;
}

int &f2(){
    int a=10;
    int *v;
    v=&a;
    return *v;
}

int main(){
    int b,a;
    b=f();
    a=f2();
    cout<<b<<' '<<a;
    return 0;
}

6 Risposte

  • Ti torna 10 per caso, è un comportamento indefinito. Dovresti fare così:
    
    int &f2(){
        int *v = new int {10};  
        return *v;
    }
    
  • Faccio una domanda da inesperto, scusatemi

    Ma così facendo non si lascia un area di memoria allocata ma non più puntata, quello che chiamano 'dangling pointer'?
  • StandardOil ha scritto:


    Faccio una domanda da inesperto, scusatemi

    Ma così facendo non si lascia un area di memoria allocata ma non più puntata, quello che chiamano 'dangling pointer'?
    Sì, ma si chiama memory leak.
    Un oggetto potrebbe mantenere al suo interno il puntatore alla memoria allocata, oppure restituire un reference a sé stesso (il caso dell'operatore =). In quel caso restituire il reference sarebbe un'operazione sicura.

    Oppure c'è il caso particolare:
    
    int f() {
      return 5;
     } 
    void main{
    const int& myref = f();
    } 
    
    In questo caso il valore temporaneo ritornato da f sopravvive fintanto che myref non esce dal suo scopo, anche se è immodificabile.
  • Grazie
  • StandardOil ha scritto:


    Faccio una domanda da inesperto, scusatemi

    Ma così facendo non si lascia un area di memoria allocata ma non più puntata, quello che chiamano 'dangling pointer'?
    Certo che c'è memory leak, ma l'OP sta facendo una cosa più pericolosa dato che int a di f2() è nello stack ed è molto probabile che venga sovrascritta. Infatti non è detto che a schermo abbia "10 10".
    Poi più avanti ovviamente dovrà imparare a liberare la memoria heap correttamente, quando userà centinaia di MB di RAM. Un passo alla volta
  • Grazie mille
Devi accedere o registrarti per scrivere nel forum
6 risposte