Làm thế nào quan trọng là sửa chữa rò rỉ bộ nhớ?


19

Tôi đã tìm thấy bởi Valgring rằng một số chương trình GTK + bị rò rỉ bộ nhớ. Làm thế nào quan trọng là sửa chữa những rò rỉ? Ý tôi là, thường thì các chương trình đó hoạt động rất tốt nhưng mặt khác, người ta không bao giờ có thể chắc chắn nếu một người muốn sao chép một phần mã bị rò rỉ sang một số chương trình khác. Và tôi không chắc liệu ý tưởng về chương trình GTK + có hoạt động nhanh hay không và do đó có rò rỉ.

Vì vậy, nếu đôi khi tôi thấy rò rỉ bộ nhớ trong một chương trình nguồn mở, tôi có nên sửa nó hay không, ví dụ như có vấn đề về hiệu quả và do đó, ý tưởng ban đầu của các lập trình viên là viết một số mã rò rỉ nhỏ?


17
Rò rỉ bộ nhớ luôn là điều không mong muốn. Chúng đại diện cho các tài nguyên mà toàn bộ hệ thống có thể sử dụng, bao gồm cả chương trình máy chủ, cho đến khi chương trình kết thúc.
đệ quy.ninja

Có đủ các công cụ / thư viện xử lý rò rỉ bộ nhớ. Đó là giá trị nỗ lực, vì việc sử dụng API về phía bạn có thể sai.
Eggen

1
Như một lưu ý phụ - tuyệt vời của valgrind nhưng có thể báo cáo một số mặt tích cực sai (tôi đã thấy chúng trong GObject).
Maciej Piechotka

Tính toán phụ thuộc vào quá trình xử lý và bộ nhớ: trước đây là mã và không gian sau nó chạy. Nếu bạn không thể tin tưởng không bỏ rác phòng riêng của mình, làm thế nào bạn có thể mong đợi sử dụng nó cho một cái gì đó hữu ích?
imallett

1
"Luôn luôn mã như thể người cuối cùng duy trì mã của bạn là một kẻ tâm thần bạo lực, người biết bạn sống ở đâu."
Jesse C. Choper

Câu trả lời:


6

Làm thế nào là quan trọng để khắc phục rò rỉ bộ nhớ phụ thuộc vào mức độ nghiêm trọng của vấn đề và những gì khác bạn phải làm điều đó là quan trọng. Kinh nghiệm của tôi là rò rỉ bộ nhớ nhỏ có xu hướng khá lành tính đối với hầu hết các ứng dụng. Thời gian tồn tại của phiên ứng dụng trên máy tính để bàn thường không đủ dài để thấy bất kỳ sự xuống cấp nào từ rò rỉ bộ nhớ nhỏ.

Nếu bạn đang viết một máy chủ chạy 24/7, thì rò rỉ bộ nhớ nhỏ có thể tăng lên theo thời gian và trở thành một vấn đề lớn. Nhưng đó là lý do tại sao nhiều công ty lên lịch cho máy chủ của họ để khởi động lại hàng ngày hoặc hàng tuần. Nỗ lực tìm kiếm rò rỉ bộ nhớ thường quá mức so với những gì có thể đạt được, vì vậy việc khởi động lại máy chủ một cách thường xuyên và chuyển sang những điều quan trọng hơn sẽ dễ dàng hơn.


2
Tôi chưa bao giờ làm việc trong một công ty khởi động lại máy chủ của họ hàng tuần ... thậm chí ít hơn hàng ngày. Tôi đồng ý chi phí để khắc phục rò rỉ có thể cao để sửa nó nhưng có suy nghĩ này không tốt IMO
Rémi

@ Rémi Hầu hết, nếu không phải tất cả, các máy chủ trò chơi MMO đều làm, thường là hàng tuần.
Sjoerd

35

Đối với các chương trình chạy ngắn, rò rỉ bộ nhớ không quan trọng bằng; HĐH sẽ đòi lại mọi thứ khi chấm dứt, nhưng chúng có thể khiến các tài nguyên khác không được phát hành.

Tuy nhiên, chạy ngắn là tương đối, một rò rỉ có thể vượt khỏi tầm kiểm soát trong vài giờ hoặc chồng chất trong nhiều tuần không được chú ý.

Lời khuyên của tôi là gửi một lỗi trong trình theo dõi với một bản sửa lỗi được đề xuất, nếu khách hàng tiềm năng quan tâm, anh ta sẽ sửa nó.

Các loại rò rỉ cũng rất quan trọng. Có thể phân bổ rò rỉ là phân bổ một lần trong đó nhà phát triển cố tình dựa vào HĐH để dọn dẹp. Những điều này sẽ cho một dương tính giả trên valgrind.


4
Tôi hầu hết đồng ý. Tuy nhiên tôi đề nghị bạn nhấn mạnh tầm quan trọng của rò rỉ bộ nhớ. Rò rỉ bộ nhớ không được xem nhẹ và có thể gây ra một số "tính năng" thú vị cho ứng dụng của bạn.
Vladimir Kocjancic

@VladimirKocjancic: +1 cho "tính năng"
Emilio Garavaglia

1
Tôi chỉ muốn chỉ ra rằng một máy tính có khả năng thực hiện quá trình xử lý một triệu lần đó một cách nhanh chóng vài triệu lần. Đừng bao giờ quên điều đó. Vì vậy, nếu bạn tính đến điều đó thì tôi đồng ý với câu trả lời này, vì nó thực sự phụ thuộc vào chương trình. Đối với một hệ thống nhúng có ý định chạy mà không có sự can thiệp của con người, rò rỉ bộ nhớ là rất nguy hiểm. Đối với việc triển khai "grep", có lẽ bạn không thể quan tâm ít hơn.
Dunk

2
@Dunk: Nó phụ thuộc: nếu bạn grepthông qua một tệp rất lớn và chương trình của bạn bị rò rỉ một vài byte cho mỗi dòng đầu vào, bạn có thể hết bộ nhớ.
Giorgio

0

Theo ý kiến ​​giáo điều của tôi về chủ đề này, không có lời bào chữa nào cho rò rỉ vật lý ít nhất là trong bất kỳ thư viện nào nhằm mục đích áp dụng rộng rãi. Vì vậy, tôi sẽ tìm cách sửa lỗi các nhà phát triển GTK + cho đến khi họ tự sửa nó.

Nó đủ tầm thường để một thư viện đăng ký các atexitcuộc gọi lại để giải phóng bất kỳ bộ nhớ nào mà nó phân bổ ít nhất là khi không được tải. Nếu nó muốn tránh chi phí cho một lượng lớn phân bổ thiếu niên, thì không nên thực hiện chúng ngay từ đầu.

Ngay cả chương trình lười biếng nhất chỉ muốn phân bổ một khối lượng bộ nhớ thiếu niên cùng một lúc cũng có thể sử dụng bộ cấp phát tuần tự đơn giản, chỉ cần loại bỏ tất cả bộ nhớ khi tắt máy. Nếu người cấp phát thậm chí không muốn xử lý căn chỉnh, thì nó có thể chỉ cần đệm từng khối mà nó gộp thành ranh giới căn chỉnh tối đa. Nếu nó có thể có lợi với thời gian tắt máy nhanh hơn bằng cách không giải phóng tất cả các khối bộ nhớ tuổi teen đó, thì nó cũng sẽ mang lại lợi ích rất lớn cho việc đổi lấy nỗ lực tầm thường bằng cách sử dụng bộ cấp phát tuần tự như vậy, kết hợp bộ nhớ theo kiểu tuần tự thẳng phân bổ nhanh hơn nhiều so vớimallocvà nhiều mẫu bộ nhớ thân thiện với bộ đệm hơn, chỉ để có tất cả các khối lớn bộ nhớ liền kề được phân bổ bởi bộ cấp phát được giải phóng khi thư viện hoàn tất. Tất cả các thư viện đã làm sau đó là thay thế họ mallockêu gọi mà họ không bận tâm để freecó một cái gì đó giống như seq_malloc, và cuộc gọi seq_purgetrong một atexitcallback để giải phóng tất cả các cấp phát bộ nhớ khi được bốc dỡ.

Nếu không, bạn có thư viện khó chịu này làm lộn xộn các tin nhắn trong các công cụ phát hiện rò rỉ bộ nhớ của bạn, bây giờ bạn phải lọc ra. Tồi tệ hơn, nếu bạn không lọc chúng một cách có hệ thống, chúng có thể che khuất các rò rỉ trong ứng dụng của bạn và đồng nghiệp của bạn có thể phát triển thói quen xem chúng, làm giảm tính hữu dụng của các công cụ phát hiện rò rỉ ở nơi đầu tiên để ngăn chặn nhóm của bạn khỏi đẩy mã bị rò rỉ. Thật thô thiển và xấu xí và hầu hết tôi không tìm thấy những lý lẽ ủng hộ việc làm điều này một cách có chủ ý để thuyết phục tất cả những gì tầm thường khi sử dụng giải pháp ở trên.

Rò rỉ logic (loại phức tạp hơn mà ngay cả bộ sưu tập rác không thể chống lại) là một vấn đề phức tạp hơn và ở đó tôi có thể tìm thấy một số biện minh cho các chương trình tồn tại ngắn có rò rỉ logic miễn là chúng lọc hết bộ nhớ mà chúng phân bổ tắt máy vì nó đòi hỏi rất nhiều suy nghĩ về quản lý tài nguyên để tránh rò rỉ logic (có thể nói là nhiều hơn trong các ngôn ngữ có GC). Nhưng tôi không tìm thấy bất kỳ lý do hợp lý nào để tránh rò rỉ vật lý khi chúng tầm thường đến mức nào để tránh ngay cả trong bối cảnh lười biếng nhất.

Dù sao, ít nhất tôi cũng sẽ lọc ra những rò rỉ trong valgrind để họ ít nhất không gây rối với khả năng của nhóm bạn để phát hiện ra chính bạn.


1
Tôi tự hỏi nếu rò rỉ có liên quan gì đến "mã hóa thuyền"?

0

FWIW, nếu người dùng báo cáo rò rỉ trong ứng dụng mà tôi làm việc, tôi sẽ rất có xu hướng sửa nó (đặc biệt nếu họ bao gồm mã để sửa lỗi trong báo cáo lỗi!). Điều đó nói rằng, nó có thể không xảy ra ngay lập tức nếu rò rỉ nhỏ và các vấn đề khác gây bức xúc hơn (giả sử, một lỗi sự cố xảy ra thường xuyên). Nhưng tôi chắc chắn sẽ đánh giá cao nó và làm việc để sửa chữa nó cuối cùng. Bạn chắc chắn nên cho họ biết. Họ sẽ đánh giá cao nó và làm việc để sửa nó (rất có thể), hoặc họ sẽ không quan tâm và tất cả những gì nó sẽ khiến bạn phải trả giá.

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.