Tôi đã viết một chương trình C chứa mã cấp phát bộ nhớ bằng cách sử dụng malloc()
hàm. Nếu tôi không giải phóng bộ nhớ bằng free()
chức năng này, Ubuntu sẽ tự động giải phóng nó chứ?
Tôi đã viết một chương trình C chứa mã cấp phát bộ nhớ bằng cách sử dụng malloc()
hàm. Nếu tôi không giải phóng bộ nhớ bằng free()
chức năng này, Ubuntu sẽ tự động giải phóng nó chứ?
Câu trả lời:
Đúng.
Hạt nhân sẽ giải phóng tất cả các tài nguyên được phân bổ bởi một chương trình khi chấm dứt chương trình.
Điều này được thực hiện sau khi do_exit()
hàm được định nghĩa trong kernel/exit.c
đã chấm dứt thực thi; các do_exit()
chức năng thực hiện chính nó có thể được kích hoạt bởi một số sự kiện, phổ biến nhất bởi một rõ ràng exit()
syscall gọi bằng chương trình trong tính toán thường xuyên của nó hoặc bằng một ngầm exit()
syscall gọi bằng chương trình khi chấm dứt của nó (như trình biên dịch C đặt một exit()
syscall sau main()
's trở về). Các lý do khác bao gồm việc nhận tín hiệu hoặc ngoại lệ không thể bỏ qua / không thể bỏ qua.
Các do_exit()
chức năng chính nó thực hiện một số nhiệm vụ. Sau khi nó chấm dứt thực thi, các tài nguyên được phân bổ của chương trình được giải phóng bởi kernel và được trả về hệ thống để sử dụng tiếp.