簡體   English   中英

我怎么知道我是否成功地釋放了整個單鏈表?

[英]How can I know if I have successfully freed the whole array of singly linked lists?

我創建了一個指針數組。 我已將其中一些用作單鏈表的根。 lgroup (指針數組)的大小為10j也可以達到10 我喜歡這樣的每個lptr

lgroup[i].lptr[j] = (node *) malloc (sizeof(node));

如果我不打算使用它,我設置curr = lgroup[i].jptr[j]; curr->next = NULL; 否則我只是開始在每個curr->next上使用malloc然后我做curr = curr->next; 當我不想再添加任何節點到列表時,我只是把curr->next = NULL; 然后繼續下一個lptr 很標准的東西。

在我的程序結束時,我想free我為列表聲明的所有內存。 這是我嘗試這樣做的方式:

for (i = 0; i < 10; i++) {
  for (j = 0; j < 10; j++) {
    if (lgroup[i].lptr[j] == NULL) {
      free(lgroup[i].lptr[j]);
      continue;
    } else {
      curr = lgroup[i].lptr[j];
      while(curr->next != NULL) {
        curr2 = curr->next;
        free(curr);
        curr = curr2;
      }
    }
  }
}

事情是,經過大量的試驗和錯誤以及大量的“雙重釋放”和其他類似的消息后,我最終得到了這些代碼,所以我不能完全確定它是否真的釋放了我擁有的所有內存聲稱或者它恰好在沒有錯誤的情況下編譯和運行,但沒有完成我想要的所有事情。 我試着在gdb上運行它但是我真的無法通過查看內存地址來理解很多東西所以我很好奇是否有辦法檢查它是否按預期工作或者我注定要使用它筆和紙,並在我腦海中運行代碼。 如果碰巧實際上做了它的設計,是否會有更簡單,更清潔的方法來實現相同的結果?

提前感謝您,如果您需要任何澄清,請在評論中不要猶豫。

Valgrind下運行您的代碼。 這是一個執行許多操作的內存分析器,但它所做的一件事是在應用程序運行結束時檢查未釋放的內存。

在您發布的代碼中第一次調用free是沒有任何影響的,因為參數是一個NULL指針(在該上下文中使用continue也是不必要的)。

當它不是NULL並且lgroup[i].lptr[j]->next為NULL時,你似乎也沒有為lgroup[i].lptr[j]調用free。

我會把它重寫為:

for (i = 0; i < 10; i++) {
    for (j = 0; j < 10; j++) {
        curr = lgroup[i].lptr[j];
        while (curr != NULL) {
            curr2 = curr->next;
            free(curr);
            curr = curr2;
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM