Giả sử tôi malloc một số bộ nhớ vào một số con trỏ nhưng không giải phóng chúng trước khi thoát khỏi chương trình. Liệu bộ nhớ này có được tự động giải phóng khi thoát hoặc sẽ bị rò rỉ bộ nhớ tiếp tục ở đó cho đến khi tôi khởi động lại máy tính?Heap có được giải phóng khi chương trình thoát không?
Trả lời
Câu trả lời là, thường xuyên nhất.
Giải phóng heap là trách nhiệm của hệ điều hành. Trong khi hầu hết các hệ điều hành (đặc biệt là hệ điều hành chính thống) giải phóng heap khi thoát, nó không nhất thiết phải đúng của hệ điều hành nhúng hệ điều hành.
Khi bạn gọi bộ nhớ được cấp phát trên heap, một cuộc gọi hệ thống được thực hiện tới không gian hạt nhân của hệ điều hành để cung cấp bộ nhớ này. Bộ nhớ này được ánh xạ tới cấu trúc quy trình của bạn, được duy trì bởi hệ điều hành. Khi chương trình của bạn thoát, hệ điều hành đi qua một định tuyến dọn dẹp, đóng tất cả các bộ mô tả tập tin và đánh dấu bộ nhớ này miễn phí để phân bổ cho các quy trình khác (trong số các thứ khác).
Một số câu trả lời không chính xác khi nói rằng nó phụ thuộc vào trình biên dịch. Trình biên dịch không nói 'hey miễn phí tất cả bộ nhớ này trên chương trình thoát'. Điều đó sẽ không có ý nghĩa, điều gì sẽ xảy ra nếu hệ điều hành bất ngờ chấm dứt chương trình sau đó? Không, trình biên dịch chịu trách nhiệm tạo ra các cuộc gọi hệ thống bất cứ khi nào cấp phát bộ nhớ/deallocation được yêu cầu rõ ràng cho vùng heap.
Bất kỳ hệ điều hành máy tính để bàn hiện đại nào đều sẽ lấy lại tài nguyên khi quá trình thoát. Sẽ không có rò rỉ bộ nhớ.
Bộ nhớ sẽ không được giải phóng bởi chương trình hoặc libc của bạn, nhưng sẽ được giải phóng bởi hệ điều hành trên tất cả các hệ điều hành hiện đại. Họ chỉ định bộ nhớ cho các quy trình cụ thể và làm sạch bộ nhớ khi quá trình chấm dứt.
không phải tất cả các hệ điều hành sẽ làm điều này. – 75inchpianist
Tùy thuộc vào hệ điều hành bạn đang sử dụng. Rõ ràng, mọi hệ điều hành máy tính để bàn hiện đại đều được thiết kế để xóa sau khi bạn thoát khỏi chương trình, nếu cần.
Nếu bạn nhìn vào tiêu chuẩn C, đó là triển khai cụ thể để bạn không thể chắc chắn về điều đó.
Nhưng hầu hết hệ điều hành sẽ giải phóng bộ nhớ khi quá trình chấm dứt, nhưng có thể không phải là trường hợp trên một số nền tảng nhỏ hơn/đơn giản hơn.
Đó không phải là câu hỏi c. Làm thế nào heap được thực hiện phụ thuộc vào trình biên dịch và những gì os không sau khi một chương trình thoát. Để hiểu biết của tôi tất cả các nguồn tài nguyên bộ nhớ miễn phí os hiện đại khi một chương trình thoát. Điều này có thể không đúng trên một số hệ thống hoặc trình điều khiển được nhúng.
cách heap được giải phóng sau khi thoát khỏi chương trình là độc lập với trình biên dịch. nó là một vấn đề hệ điều hành. – 75inchpianist
Yea thats những gì tôi đã cố gắng để nói. nhưng không tốt. Các complier có một số nói về cách heaps được thực hiện. Bạn có thể có các chương trình C trên Os mà không có không gian địa chỉ ảo hoặc quản lý bộ nhớ. Trên tất cả các cấy ghép hiện đại trình biên dịch chuyển tiếp các cuộc gọi đến các cuộc gọi hệ thống nhưng thats không nhất thiết phải là trường hợp – rerun
- 1. Điều gì sẽ xảy ra với bộ nhớ không được giải phóng sau khi kết thúc chương trình?
- 2. sau khi một luồng được truyền tới CommandGet, khi nào nó có thể được giải phóng?
- 3. Tôi có thể giải phóng bộ nhớ cho SysAllocString không?
- 4. gdb: thoát khỏi chương trình mà không thoát khỏi gdb
- 5. Tôi có nên giải phóng bộ nhớ được cấp phát khi chấm dứt bất thường?
- 6. Cách giải quyết GC_concurrent được giải phóng?
- 7. Cách giải phóng bộ nhớ?
- 8. Bộ nhớ của mảng (ký tự) có được giải phóng bằng cách thoát khỏi phạm vi không?
- 9. Bộ hẹn giờ này có được giải phóng khỏi bộ nhớ không?
- 10. Có thể thực hiện điều gì đó khi chương trình Java thoát đột ngột không?
- 11. Cách dọn dẹp chương trình khi thoát khỏi chương trình javafx?
- 12. C++ destructor: khi bộ nhớ được giải phóng?
- 13. Chức năng gọi khi thoát chương trình trong java
- 14. Tắt GPS theo chương trình khi tôi thoát khỏi chương trình của tôi
- 15. Chương trình đã thoát với mã -2147483645
- 16. Chương trình Java có thể phát hiện rằng nó đang chạy thấp trên không gian heap?
- 17. Đa xử lý Python - Cách giải phóng bộ nhớ khi quá trình được thực hiện?
- 18. Giải phóng bộ nhớ được phân bổ với newCString
- 19. lấy mã thoát cho chương trình python
- 20. WeakReferences không được giải phóng trong hệ điều hành nhúng
- 21. cách lấy kích thước Heap của một chương trình
- 22. Thoát khỏi một chương trình bằng Python?
- 23. Cách thoát chương trình: sys.stderr.write() hoặc in
- 24. Làm cách nào để thoát khỏi chương trình theo lô khi có lỗi?
- 25. Con trỏ không liên kết được giải phóng, trong Java?
- 26. Python matplotlib: bộ nhớ không được giải phóng khi chỉ định kích thước hình
- 27. Phương thức ArrayList.clear() có giải phóng bộ nhớ không?
- 28. Chương trình Clojure không thoát khi hoàn thành câu lệnh cuối cùng?
- 29. Tại sao đầu ra của tôi không hiển thị cho đến khi chương trình thoát?
- 30. Tôi có cần giải phóng CGColorSpaceRef trong ARC không?
Đi qua [this] (http://stackoverflow.com/questions/2215259/will-malloc-implementations-return-free-ed-memory-back-to-the-system) và [this] (http: //stackoverflow.com/questions/654754/what-really-happens-when-you-dont-free-after-malloc) quá. –