2010-07-23 57 views
11

Chương trình của tôi (trình duyệt web chế độ văn bản) đang cấp phát bộ nhớ động.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?

Tôi thực hiện các khối không cần thiết miễn phí trong thời gian chạy, tất nhiên. Và tôi làm mọi thứ miễn phí trước khi chấm dứt bình thường - để những người kiểm tra rò rỉ bộ nhớ sẽ không cho tôi những kết quả dương tính giả (và linh hoạt nên các phép tái cấu trúc chính sẽ trở nên cần thiết).

Bây giờ, những gì tôi làm không làm là giải phóng bộ nhớ trước khi chấm dứt bất thường. (Hiện tại, chương trình của tôi chấm dứt trên các tín hiệu và sau khi không thành công mallocs/reallocs.)

Câu hỏi của tôi là: Bạn có cho rằng kiểu xấu này không? Tôi có nên tự do chấm dứt bất thường không?

+0

hệ thống của bạn sẽ lấy lại bộ nhớ khi quá trình của bạn chấm dứt, phải không? –

Trả lời

12

No. Tôi nghĩ hoàn toàn có thể chấp nhận được khi bạn chỉ cần giơ tay lên và để hệ điều hành lấy lại bộ nhớ sau khi chương trình kết thúc. Tôi nghĩ nếu đây thực sự là một tình huống bất thường và dự định sẽ chấm dứt chương trình, thì một chương trình được xử lý tốt chỉ đơn giản là dọn sạch mọi tài nguyên/ổ đĩa và thoát ra càng nhanh càng tốt.

4

Theo ý kiến ​​của tôi, việc giải phóng bộ nhớ khi gặp sự cố là không cần thiết. Khi quá trình của bạn chấm dứt, hệ điều hành sẽ lấy lại bộ nhớ, vì vậy tất cả những gì bạn phải làm là thoát.

Mặt khác, các tài nguyên khác (ví dụ: mở tệp) phải được đóng hoặc ít nhất là bị xóa - nếu không, chúng có thể không được lưu trữ/lưu trữ không đầy đủ do bộ đệm.

0

Việc chấm dứt bất thường quy trình của bạn không dẫn đến các khối bộ nhớ không thể được sử dụng bởi các quy trình khác (có nghĩa là chúng được miễn phí), nếu chúng được phân bổ.

Chúng tôi cấp phát/bộ nhớ miễn phí bằng cách sử dụng các chỉ thị OS để hệ điều hành không bị lỗi theo dõi các khối dữ liệu cho từng quá trình và dịch chúng thành một không gian bộ nhớ ảo liền kề. Khi quá trình chết, trình tải hệ điều hành báo hiệu nó và tất cả bộ nhớ sẽ bị thu hồi. Mọi thứ trở nên phức tạp khi các quá trình chia sẻ bộ nhớ.

Quy trình ngang hàng, nếu bạn không bắt đầu/khởi chạy/chia nhỏ quy trình (ví dụ: xem xét thành phần bên ngoài phục vụ nhiều quy trình truy cập tài nguyên đa phương tiện), có thể đã tạo bộ nhớ (ví dụ: bộ đệm) để phục vụ quy trình của bạn. Tùy thuộc vào chính sách sở hữu của các thành phần bên ngoài này, bộ nhớ đó có thể không được miễn phí khi chết theo quy trình phục vụ.

Tôi khuyên bạn nên thử kiểm tra tất cả bộ nhớ được cam kết trước và sau các trường hợp kết thúc bất thường.

0

Chỉ khi hệ điều hành của bạn không xác nhận lại bộ nhớ khi chấm dứt chương trình. DOS và 'bộ nhớ dính' của nó là một ví dụ về một hệ điều hành như vậy. Trên hầu hết các hệ điều hành hiện đại không miễn phí() 'ing trên chấm dứt bất thường là một vấn đề không.

+0

loại bộ nhớ nào mà DOS không đòi lại khi chấm dứt chương trình? – unbeli

+0

Hrm. Bạn có chắc đó là sự thật không? – Gian

+0

Tôi chắc chắn nó đúng với ít nhất một biến thể của MSDOS và BDOS của CP/M - chúng có hỗ trợ cho cái gọi là 'bộ nhớ dính' mà một chương trình có thể phân bổ không gian, và vẫn được phân bổ ngay cả sau khi nó kết thúc. Ngoài ra, các cuộc gọi TSR trong MSDOS đạt được một cái gì đó tương tự, nhưng tôi sẽ không xem xét nó 'chấm dứt bất thường'. –

0

Không, trừ khi chương trình của bạn luôn chấm dứt bất thường. :) Dù sao, hệ điều hành làm một công việc tốt giải phóng nó lên. Trong thực tế, nhiều lập trình viên lười biếng thậm chí không bận tâm giải phóng mọi thứ với việc chấm dứt bình thường - nhưng điều này làm cho việc phát hiện rò rỉ bộ nhớ khác khó khăn (những vấn đề thực sự là vấn đề).

3

Bạn không cần để xác nhận lại bộ nhớ khi chấm dứt bình thường ngoại trừ để giảm bớt các lỗi tích cực trong công cụ phát hiện rò rỉ.

Nếu chương trình của bạn chấm dứt bất thường, tùy thuộc vào nguyên nhân, bạn có thể thấy rằng bạn không thể bộ nhớ trống. Ví dụ, một SIGSEGV kết quả từ một heap bị hỏng có nghĩa là thậm chí cố gắng để giải phóng các thứ khác trên heap có thể là một bài tập vô vọng.

0

Khi chấm dứt bất thường bạn muốn thực hiện quá trình xử lý ít nhất có thể. Giảm thiểu việc mày mò với quá trình hủy bỏ sẽ có nghĩa là bạn có thể đến gần với lý do hủy bỏ càng tốt và bất kỳ quá trình xử lý nào khác có thể được coi là "làm ô nhiễm" quá trình, do đó làm cho việc gỡ lỗi trở nên khó khăn hơn.

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