Conjetura sobre una de las causas del error heap-use-after-free en la dirección

Cambie el título a leetcode86: la solución de la lista vinculada separada.
Dada una lista vinculada y un valor específico x, divida la lista vinculada de modo que todos los nodos menores que x estén antes de los nodos mayores o iguales que x.

Debe mantener la posición relativa inicial de cada nodo en las dos particiones.

Ejemplo:

Entrada: cabeza = 1-> 4-> 3-> 2-> 5-> 2, x = 3
Salida: 1-> 2-> 2-> 4-> 3-> 5

La idea del código es desensamblar una lista vinculada en dos listas vinculadas start y after, y luego conectar las dos listas vinculadas nuevamente.Cuando escribí el código, no configuré el puntero del último nodo del after vinculado list a nulo, y se informó un error en este momento heap-use-after-free en la dirección. Después de agregar esta oración after-> next = nullptr; pasó, por lo que Baidu.

Baidu se enteró más tarde: Un blog tenía mucho sentido.
¿Por qué el último (nodo de cola) de la lista enlazada sería incorrecto si no hay trasero-> siguiente = NULL; esta lista enlazada?
¡Déjame decirte por qué!
Ha cometido este error muchas veces
recientemente . Dígale que no cometa ningún error en el futuro. Si el último nodo de la lista enlazada individualmente no está claramente señalado, la
computadora piensa que la lista enlazada no está completamente establecida, no lo hará. detener.
Por lo tanto, debemos tener en cuenta al construir la lista vinculada, el último nodo debe apuntar a un punto,
ya sea que el nodo principal forme una lista vinculada circular o apunte a un valor NULL.
En resumen, ¡no se puede dejar vacío!
¡recuerda!

class Solution {
    
    
public:
    ListNode* partition(ListNode* head, int x) {
    
    
		ListNode* before = new ListNode(0);
		ListNode* before_head = before;
		ListNode* after = new ListNode(0);
		ListNode* after_head = after;
		
		while(head){
    
    
			if(head->val<x){
    
    
				before->next = head;
				before = before->next;
			}
			else{
    
    
				after->next = head;
				after = after->next;
			}
			head = head->next;
		}
		//该行如果不加会报错heap-use-after-free
		after->next = nullptr;
		before->next = after_head->next;
		return before_head->next;
		
    }
};

Supongo que te gusta

Origin blog.csdn.net/weixin_43919570/article/details/108920857
Recomendado
Clasificación