5

Estructuras de datos simples, por ejemplo listas vinculadas, donde el puntero 'siguiente' es un puntero inteligente. Cuando el nodo principal se elimina, el puntero inteligente para "siguiente" se activa y realiza una eliminación recursiva. Para una larga lista, esto rápidamente sopla la pila.Puntero inteligente sopla pila debido a la eliminación recursiva

He tenido que volver para reemplazar estos punteros inteligentes con punteros simples y crudos. ¿Me estoy perdiendo de algo?

+0

'sopla la pila'? puedes elaborar por favor? – Flexo

+2

Casi con seguridad, esto no es culpa del puntero inteligente. Muéstranos un código, seguramente habrá un error en la implementación. En cualquier caso, la eliminación completa de la lista debe ser por iteración, no por recursión, por lo que debe tomar espacio constante en la pila. –

+1

@Kerrek: presumiblemente, el destructor del puntero inteligente elimina el puntero, lo que dará recursividad si el puntero contiene otro puntero inteligente. No veo cómo se podría implementar el puntero inteligente para evitar eso. –

Respuesta

5

Suponiendo que he entendido que tanto la derecha y head y next son punteros inteligentes que usted puede evitar esto haciendo:

head = head->next; 

o equivalente. Su "antigua" cabeza será eliminada y el antiguo elemento de segundo lugar será promovido a la cabeza. Todo en un cambio consistente, sin recursión profunda. La única condición previa para esto es que head no es NULL para empezar.

Como Mike señaló en el comentario si el objetivo es eliminar toda la lista, entonces puede repetir eso dentro de un bucle.

+3

Sí, para que pueda eliminar la lista completa de forma no recursiva con 'while (head) head = head-> next;' –

+1

No olvide comentarlo, porque alguien irá y vendrá WTF :) – UncleBens

+0

"Your 'old 'la cabeza se eliminará y el antiguo elemento de segundo lugar será promovido a la cabeza. "- Esa afirmación, aunque refleja lo que está sucediendo, es una simplificación increíble. A menos que el lector casual esté * muy * bien versado tanto en la mecánica del lenguaje como en la funcionalidad del puntero inteligente, esta solución, mientras funciona, es más mágica que cualquier otra cosa. Y si son tan familiares, probablemente no lo necesiten en primer lugar. Un paso a paso de exactamente lo que está sucediendo durante esa simple asignación 'head = head-> next' haría esto * sustancialmente * más claro. – WhozCraig

2

Punteros inteligentes en las partes internas de una clase de lista vinculada no parece que le compre mucho. Los indicadores crudos me parecen perfectamente razonables. Creo que los punteros inteligentes se usan mejor en situaciones menos controladas en las que sería fácil olvidarse de eliminar algo.

Ten en cuenta que debes haber sido una gran lista para volar la pila, ¿estás seguro de que no tienes un error en tu código?

+0

Punteros inteligentes en el interior, compre garantías de seguridad excepcionales más altas. Gratis en términos de mano de obra y muy poco costo adicional de almacenamiento constante. Solo eso parece valer la pena para mí. – Flexo

+0

Sí, es un buen punto. – john

+0

Bueno, uso un puntero inteligente para contener un nodo recién creado antes de que se adjunte a la lista. Pero, una vez conectado, es la responsabilidad del destructor del nodo de la lista. Como ya observaron, tengo que hacer un procesamiento manual en el destructor de todos modos para reemplazar la recursión automática del puntero inteligente con iteración codificada a mano. ¿Podrían explicar los problemas de seguridad de excepción? Pensé que cualquier excepción no controlada en un destructor matará al programa de todos modos, independientemente de los punteros inteligentes. – Jay

Cuestiones relacionadas