2013-04-08 65 views
6

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?

+1

Đ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á. –

Trả lời

5

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.

1

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ớ.

2

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.

+0

không phải tất cả các hệ điều hành sẽ làm điều này. – 75inchpianist

1

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.

1

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.

1

Đó 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.

+0

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

+0

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

Các vấn đề liên quan