thắc mắc [C] Giải thích giúp em với đoạn code free linked list

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?
 
Sau lần call đầu tiên thì cả head và current đều invalid rồi mà bác nhỉ?
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 :sweat::sweat:
 
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 :sweat::sweat:
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
 
Hàm free() được sử dụng để giải phóng một khối bộ nhớ được cấp phát trước đó bằng cách sử dụng các hàm calloc, malloc hoặc realloc. Hàm free() không thay đổi giá trị của con trỏ, tức là nó vẫn trỏ đến cùng một vị trí bộ nhớ.
khi current!=null, free(current) nó xóa bộ nhớ cấp phát bởi current, mà current = head => xóa giá trị đc cấp phát bởi head nhưng nó vẫn trỏ đến ô nhớ head ban đầu. khi đó cả head lẫn current đều tồn tại và cùng trỏ đúng địa chỉ ô nhớ vật lí ban đầu của head, nhưng giá trị lưu tại ô nhớ ban đầu đó đã mất. còn cái trang tham khảo của ô nó ghi return value tức là return value của cả hàm free, tức là không trả về giá trị gì cả.
 
Bá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);
}
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ợp
 
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
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?
 
Vcl -> là member access through pointer trong C
Ông đùa tôi đấy à :v
1640427902396.png

ý ông có phải là đây không?
 
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 :sweat::sweat:
1640428486401.png

trước và sau khi free có chỉ về cùng 1 giá trị đâu fen:amazed:
 
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ử đó :whistle::whistle:
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?
Đây là ai nói hả bác?
 
Back
Top