Гипотеза об одной из причин ошибки адресации heap-use-after-free

Измените заголовок на leetcode86: решение разделенного связного списка.
Учитывая связанный список и конкретное значение x, разделите связанный список так, чтобы все узлы меньше x были перед узлами, большими или равными x.

Вы должны сохранить начальное относительное положение каждого узла в двух разделах.

Пример:

Вход: head = 1-> 4-> 3-> 2-> 5-> 2, x = 3
Выход: 1-> 2-> 2-> 4-> 3-> 5

Идея кода состоит в том, чтобы разобрать связанный список на два связанных списка: начало и конец, а затем снова соединить эти два связанных списка. Когда я писал код, я не устанавливал указатель последнего узла связанного после list в null, и в это время было сообщено об ошибке heap-use-after-free по адресу. После добавления этого предложения after-> next = nullptr; оно прошло, поэтому Baidu.

Позже Baidu выяснил: блог имеет много смысла.
Почему последний (хвостовой узел) связанного списка был неправильным, если в этом связанном списке нет back-> next = NULL?
Позвольте мне рассказать вам, почему!
В
последнее время вы совершали эту ошибку много раз. Скажите, чтобы вы не ошибались в будущем. Если последний узел в односвязном списке четко не указан,
компьютер считает, что связанный список не полностью установлен, и не будет стоп.
Поэтому при построении связанного списка мы должны помнить, что последний узел должен указывать на точку,
независимо от того, образует ли головной узел круговой связанный список или указывает на значение NULL.
Короче, его нельзя оставлять пустым!
помнить!

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;
		
    }
};

рекомендация

отblog.csdn.net/weixin_43919570/article/details/108920857
рекомендация