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 atexit
cuộ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ớimalloc
và 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ọ malloc
kêu gọi mà họ không bận tâm để free
có một cái gì đó giống như seq_malloc
, và cuộc gọi seq_purge
trong một atexit
callback để 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.