2012-03-20 22 views
7
struct node 
{ 
    Item item; node *l, *r; 
    node(Item x) {item = x; l = 0; r = 0;} 
}; 

typedef node* link; 
link max(Item a[], int l, int r) 
{ 
    int m = (l+r)/2; 
    link x = new node(a[m]); 
    if (l==r) return x; // return a local pointer 
    x->l = max(a, l, m); 
    x-r = max(a, m+1, r); 
    Item u = x->l->item, v = x->r->item; 
    if (u>v) x->item = u; 
    else x->item=v; 

    return x; // return a local pointer 
} 

Questa è una parte di codice da "Algorithm in C++" di Robert Sedgewick, pagina 252, Programma 5.19. E nella funzione max(), la variabile restituita è un puntatore che viene creato all'interno della funzione.restituisce un puntatore locale

A mio parere, restituire un puntatore locale non è consentito in c/C++. Quindi la mia domanda è che "è OK scrivere una funzione come questa"? Non posso credere che un libro così classico commetta errori come questo. O ho frainteso il principio? Per favore aiuto. Grazie.

+0

'link x = nuovo nodo (a [m]);'! = Puntatore locale – Mysticial

+1

@Mysticial: Pedanticamente parlando, * è * un puntatore locale, ma non punta a un oggetto locale :-) –

+0

In 'c' restituire un puntatore a una variabile locale con risultato in un avviso, e probabilmente dovrebbe essere evitato a meno che non si sappia cosa si sta facendo, ma funzionerà. Non è sicuro che 'C++' lo cambi in un errore. – twain249

risposta

5

x non è un "puntatore locale", ovvero un puntatore a una variabile locale. *x è stato allocato utilizzando new. x punta alla memoria allocata dinamicamente e restituire quel puntatore va bene. Quindi sì, è OK scrivere una funzione come questa, e non c'è un errore nel libro.

3

È un errore restituire un puntatore a una variabile locale. x indica una variabile allocata sul mucchio:

link x = new node(a[m]); 

Così x non punta a una variabile locale.

Il motivo per cui restituire un puntatore a una variabile locale è un errore è che tale variabile esiste solo fino a quando la funzione è attiva (ad esempio, tra l'immissione e l'uscita). Le variabili allocate nello heap (ad esempio con l'uso dell'operatore new) esistono finché non vengono deallocate (ad esempio con l'operatore delete).

+0

Quindi la memoria allocata a x non verrà liberata finché non lo facciamo esplicitamente. O posso dire che la memoria allocata sullo stack di funzioni sarà indefinita se la variabile non rientra nello scope; ma su heap no? –

+0

Sì. Hai bisogno di una deallocazione esplicita. Inoltre, una variabile allocata nell'heap continuerà ad esistere dopo essere tornata dalla funzione che l'ha allocata. –

1

Questo va perfettamente bene, perché i contenuti di x sono allocati nell'heap, non nello stack. Potresti essere confuso visto che c'è uno typedef node* link; lì, che lo fa apparire come un'allocazione dello stack poiché maschera il fatto cheè in realtà un node *.

+1

'x' è una variabile automatica. Stavi forse pensando a '* x'. –

+0

@KerrekSB sì, suppongo intendessi "il contenuto di' x' è allocato sull'heap ", modificato per chiarezza. – jli

+0

In realtà, il contenuto di 'x' è il contenuto di una variabile automatica. Stavi forse pensando al contenuto di '* x'? –

Problemi correlati