Tiến Đức
Senior Member
C:
current = head;
while (current != NULL) {
free(current);
current = current->next;
}
Tham khảm: https://en.cppreference.com/w/c/memory/free
Last edited:
current = head;
while (current != NULL) {
free(current);
current = current->next;
}
free(current);thì hàm đó giúp con trỏ đó deallocate, xong nó sẽ trở thành một nullptr, xong người ta trỏ lại sang head->next thôi?
current là head đó bác, nói thế để dễ hiểu đang thao tác trên head của linkedlist thôifree(current);
current = current->next;
Dòng nào là head->next bác
Sau lần call đầu tiên thì cả head và current đều invalid rồi mà bác nhỉ?current là head đó bác, nói thế để dễ hiểu đang thao tác trên head của linkedlist thôi
Coi con trỏ như hộp chứa, thì free nó chỉ lấy phần bên trong hộp vứt ra khỏi hộp, chứ có phải là vứt cái hộp đi đâu, lúc này current nó là một nullptr thôi. Có vẻ bác hiểu sai ở đây là một con trỏ bằng nullptr thì không dùng được nữa thì phảiSau lần call đầu tiên thì cả head và current đều invalid rồi mà bác nhỉ?
Lol, current là nullptr, bác hình như đang hiểu sai thì phải, sau khi free, nội dung tại data object current pointer trỏ tới tất nhiên vẫn ở đó, nhưng vùng ram đó đã đc trả lại cho memory pool của OS và có thể được cấp phát cho chương trình khác, dereference pointer sau khi free gây undefined behavior. Rõ ràng là bad code mà bácCoi con trỏ như hộp chứa, thì free nó chỉ lấy phần bên trong hộp vứt ra khỏi hộp, chứ có phải là vứt cái hộp đi đâu, lúc này current nó là một nullptr thôi. Có vẻ bác hiểu sai ở đây là một con trỏ bằng nullptr thì không dùng được nữa thì phải
sai ở chỗ nào bác chỉ em vớiLol current là nullptr, bác hình như đang hiểu sai thì phải
current = head;
public cleanList(current){
if(current->next != null){
cleanList(current->next);
}
free(current);
}
Vâng, túm lại đoạn code trên là tệ, dù rằng nó vẫn sẽ hoạt động trong một vài trường hợpBác cần phải kiểm tra cái next nó có là null không nếu next là null thì free cái current, còn không thì call clean next
sample đệ quy:
Code:current = head; public cleanList(current){ if(current->next != null){ cleanList(current->next); } free(current); }
Mình đang giải thích code chứ có nói gì bad code hay good code đâu? Mà chưa kể, sau khi free, họ đâu dùng đến toán tử nào là dereference?Lol, current là nullptr, bác hình như đang hiểu sai thì phải, sau khi free, nội dung tại data object current pointer trỏ tới tất nhiên vẫn ở đó, nhưng vùng ram đó đã đc trả lại cho memory pool của OS và có thể được cấp phát cho chương trình khác, dereference pointer sau khi free gây undefined behavior. Rõ ràng là bad code mà bác
Vcl -> là member access through pointer trong CMình đang giải thích code chứ có nói gì bad code hay good code đâu? Mà chưa kể, sau khi free, họ đâu dùng đến toán tử nào là dereference?
Vcl -> là member access through pointer trong C
Ông đùa tôi đấy à :v
Đây là C code chứ phải C++,View attachment 941396
ý ông có phải là đây không?
nói thật ông về nhà học lại nhéĐây là C code chứ phải C++,
https://en.cppreference.com/w/c/language/operator_member_access
Coi con trỏ như hộp chứa, thì free nó chỉ lấy phần bên trong hộp vứt ra khỏi hộp, chứ có phải là vứt cái hộp đi đâu, lúc này current nó là một nullptr thôi. Có vẻ bác hiểu sai ở đây là một con trỏ bằng nullptr thì không dùng được nữa thì phải
Oke ông thần, họ đâu dùng toán tử dereferencenói thật ông về nhà học lại nhé
người ta không dùng xong tự ông nhắc đến, tôi đưa cho ông hiểu thế nào là dereference thì ông lại bảo người ta đâu dùng đến toán tử đóOke ông thần, họ đâu dùng toán tử dereference
Mình đang giải thích code chứ có nói gì bad code hay good code đâu? Mà chưa kể, sau khi free, họ đâu dùng đến toán tử nào là dereference?người ta không dùng xong tự ông nhắc đến, tôi đưa cho ông hiểu thế nào là dereference thì ông lại bảo người ta đâu dùng đến toán tử đó