アドレスエラー時のヒープ使用後解放の原因の1つに関する推測

タイトルをleetcode86に変更します:分離されたリンクリストの解決策。
リンクリストと特定の値xが与えられた場合、x未満のすべてのノードがx以上のノードの前になるようにリンクリストを分割します。

2つのパーティションの各ノードの初期相対位置を維持する必要があります。

例:

入力:ヘッド= 1-> 4-> 3-> 2-> 5-> 2、x = 3
出力:1-> 2-> 2-> 4-> 3-> 5

コードのアイデアは、リンクリストを最初と後に2つのリンクリストに逆アセンブルし、次に2つのリンクリストを再度接続することです。コードを書いたとき、リンク後の最後のノードのポインターを設定しませんでしたリストがnullになり、この時点でアドレスのheap-use-after-freeでエラーが報告されました。この文を追加した後-> next = nullptr;合格したので、Baidu。

Baiduは後で発見しました:ブログは非常に理にかなっています
。rear-> 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