Bộ nhớ bị rò rỉ có được giải phóng khi chương trình thoát không?


Câu trả lời:


151

Đúng, "rò rỉ bộ nhớ" chỉ đơn giản là bộ nhớ mà một tiến trình không còn tham chiếu đến, và do đó không thể giải phóng được nữa. Hệ điều hành vẫn theo dõi tất cả bộ nhớ được cấp cho một quá trình và sẽ giải phóng bộ nhớ khi quá trình đó kết thúc.

Trong phần lớn các trường hợp, hệ điều hành sẽ giải phóng bộ nhớ - như trường hợp với các "hương vị" thông thường của Windows, Linux, Solaris, v.v. Tuy nhiên, điều quan trọng cần lưu ý là trong các môi trường chuyên biệt như các Hệ điều hành thời gian thực khác nhau, bộ nhớ có thể không được giải phóng khi chương trình bị kết thúc.


4
Câu hỏi: Hệ điều hành có theo dõi tất cả các phân bổ không? Bất kỳ bộ nhớ heap nào bạn cấp phát đều đến từ không gian bộ nhớ ảo của tiến trình - khi tiến trình kết thúc, không gian đó được trả lại cho hệ thống bán buôn, phải không? Tôi không hiểu tại sao việc ghi sổ kế toán bổ sung lại cần thiết, vì dù sao thì quá trình thực hiện phân bổ cũng là quá trình duy nhất (trong vùng đất người dùng) có quyền truy cập vào các trang đó. Hay tôi đã bị dạy sai?
Chris Tonkinson

6
@Justin: Không biết hệ điều hành, tôi không nghĩ điều này hợp lệ. Có thể chỉ định rõ ràng hệ điều hành bạn đang nói đến.
Brian R. Bondy

1
Lưu ý: tiêu chuẩn không nói bất cứ điều gì về điều này. Nó cũng không được đảm bảo. Đây là cách nó hoạt động trên hầu hết, nếu không phải tất cả, hệ điều hành hiện đại nhưng chúng không bắt buộc phải làm như vậy và trước đây đã có những hệ điều hành phổ biến và không thực hiện việc dọn dẹp này.
Edward Strange

5
Có nhiều hệ điều hành thời gian thực khác nhau dành cho các thiết bị nhỏ, v.v. không lấy lại bộ nhớ bị mất khi bị rò rỉ. Câu hỏi của bạn phụ thuộc vào hệ điều hành bạn đang nói đến.
Brian Neal

14
Ngay cả với các hệ điều hành được bảo vệ bộ nhớ cụ thể, bạn vẫn cần phải xác định "rò rỉ". Rất có thể các ứng dụng phân bổ tài nguyên "hệ thống" bên ngoài không gian bộ nhớ của riêng chúng (các tay cầm thường được sử dụng để xác định các tài nguyên này trong thế giới Windows). Việc đóng ứng dụng của bạn không phải lúc nào cũng đảm bảo các loại tài nguyên này được giải phóng.
David

34

Hệ điều hành thực thi chương trình của bạn thường dọn dẹp bộ nhớ không được giải phóng một cách rõ ràng và xử lý không được đóng một cách rõ ràng, nhưng điều này không được đảm bảo bởi tiêu chuẩn C ++. Bạn có thể tìm thấy một số thiết bị nhúng không giải phóng bộ nhớ của bạn bị rò rỉ.

Điều đó đang được nói rằng Windows và tất cả các bản phân phối của Linux mà tôi từng thấy đều có tác dụng giải phóng bộ nhớ.

Mặc dù vậy, bạn có thể dễ dàng tạo ra một vòng rò rỉ bộ nhớ khổng lồ để tự mình kiểm tra. Xem mức sử dụng RAM của bạn tăng lên và sau đó đóng chương trình của bạn. Bạn sẽ thấy rằng việc sử dụng RAM sẽ giảm xuống.


Một cân nhắc khác khi sử dụng C ++ là nếu bạn không xóa bộ nhớ được cấp phát heap thì các hàm hủy của bạn cũng sẽ không được gọi. Đôi khi bạn cũng sẽ có các tác dụng phụ khác nếu không gọi được hàm hủy.


14

Bạn có đang chạy trên hệ điều hành máy tính để bàn (Windows, Linux, v.v.) không? Nếu vậy, có, nói chung hệ thống sẽ giải phóng bất kỳ bộ nhớ nào liên quan đến chương trình khi chương trình thoát.


10

Thông thường, có. Một số hệ thống hỗ trợ những thứ như khối bộ nhớ dùng chung không được giải phóng tự động khi chương trình thoát. Hầu hết vẫn giữ số lượng tham chiếu và xóa nó khi tất cả các chương trình đã mở nó thoát ra, nhưng một số ít thì không (ví dụ: Windows 16-bit có một số loại mục sẽ vẫn được phân bổ ngay cả khi không có gì tham chiếu đến chúng - mặc dù nó thường bị hỏng vì những lý do khác trước khi tích lũy đủ số lượng này để gây ra sự cố ...)


5

Theo như tôi biết, một hệ điều hành hiện đại sẽ giải phóng bộ nhớ này sau khi chương trình kết thúc.


4

Phụ thuộc vào bộ nhớ bạn bị rò rỉ. Hệ điều hành không thể lấy lại một số bộ nhớ. Tuy nhiên, hầu hết bộ nhớ trên hầu hết các hệ điều hành sẽ được tự động lấy lại khi quá trình thoát.


6
Hệ điều hành không thể lấy lại một số bộ nhớ - chẳng hạn như cái gì?

2
Trên một số hệ điều hành thời gian thực, tôi đã thấy các khối đệm Ethernet đặc biệt không được dọn dẹp khi một quy trình thoát.
Brian Neal

1
Bộ nhớ dùng chung cũng thường không được lấy lại, vì bạn có thể muốn nó tồn tại cho các quá trình tạm thời sử dụng.
Brian Neal
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.