2012-03-20 12 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 
} 

Este es un fragmento de código de "Algoritmo en C++" de Robert Sedgewick, página 252, Programa 5.19. Y en la función max(), la variable devuelta es un puntero que se crea dentro de la función.devolver un puntero local

En mi opinión, devolver un puntero local no está permitido en c/C++. Entonces mi pregunta es: "¿está bien escribir una función como esta?" No puedo creer que un libro tan clásico cometa un error como este. ¿O malinterpreté el principio? Por favor ayuda. Gracias.

+0

'enlace x = nodo nuevo (a [m]);'! = Puntero local – Mysticial

+1

@Mysticial: Pedadíticamente hablando, * es * un puntero local, pero no apunta a un objeto local :-) –

+0

En 'c' devolver un puntero a una variable local con el resultado de una advertencia, y probablemente debe evitarse a menos que sepa lo que está haciendo, pero va a funcionar. No estoy seguro de que 'C++' lo cambie a un error. – twain249

Respuesta

5

x no es un "puntero local", es decir, un puntero a una variable local. *x se asignó utilizando new. x apunta a la memoria asignada dinámicamente y devuelve ese puntero está bien. Entonces sí, está bien escribir una función como esta, y no hay ningún error en el libro.

3

Es un error devolver un puntero a una variable local. x apunta a una variable asignada en el montón:

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

Así x no apunta a una variable local.

El motivo por el que devolver un puntero a una variable local es un error es que dicha variable existe solo mientras la función esté activa (es decir, entre la entrada y la salida). Las variables asignadas en el montón (por ejemplo, con el uso del operador new) existen hasta que se desasignan (por ejemplo, con el operador delete).

+0

Así que la memoria asignada a x no se liberará hasta que lo hagamos explícitamente. ¿O puedo decir que la memoria asignada en la pila de funciones no estará definida si la variable se sale del alcance; pero en montón no? –

+0

Sí. Usted necesita desasignación explícita. Además, una variable asignada en el montón seguirá existiendo después de regresar de la función que lo asignó. –

1

Esto está perfectamente bien, porque los contenidos de x se asignan en el montón, no en la pila. Es posible que se confunda, ya que hay un typedef node* link; allí, lo que lo hace parecer una asignación de pila, ya que enmascara el hecho de que x es en realidad un node *.

+1

'x' es una variable automática. Quizás estabas pensando en '* x'. –

+0

@KerrekSB, sí, supongo que quise decir "los contenidos de' x' se asignan en el montón ", editados para mayor claridad. – jli

+0

En realidad, los contenidos de 'x' son los contenidos de una variable automática. ¿Tal vez estabas pensando en los contenidos de '* x'? –

Cuestiones relacionadas