Việc sử dụng phổ biến rộng rãi của shared_ptr sẽ gần như chắc chắn gây ra sự chiếm đóng bộ nhớ không mong muốn và không nhìn thấy.
Tham chiếu tuần hoàn là một nguyên nhân nổi tiếng và một số có thể gián tiếp và khó phát hiện đặc biệt là trong mã phức tạp được thực hiện bởi nhiều lập trình viên; một lập trình viên có thể quyết định hơn một đối tượng cần tham chiếu đến một đối tượng khác như một sửa chữa nhanh và không có thời gian để kiểm tra tất cả mã để xem liệu anh ta có đang đóng chu kỳ hay không. Nguy hiểm này được đánh giá rất thấp.
Ít được hiểu hơn là vấn đề của tài liệu tham khảo chưa được phát hành. Nếu một đối tượng được chia sẻ với nhiều shared_ptrs thì nó sẽ không bị hủy bỏ cho đến khi một đối tượng nào đó bị xóa đi hoặc không nằm ngoài phạm vi. Nó rất dễ dàng để bỏ qua một trong những tài liệu tham khảo và kết thúc với các đối tượng ẩn giấu trong bộ nhớ mà bạn nghĩ rằng bạn đã kết thúc với.
Mặc dù nghiêm túc nói rằng đây không phải là rò rỉ bộ nhớ (tất cả sẽ được phát hành trước khi thoát chương trình) chúng cũng nguy hiểm và khó phát hiện hơn.
Các sự cố này là hậu quả của việc khai báo sai sự thật: 1. Khai báo những gì bạn thực sự muốn là quyền sở hữu duy nhất là shared_ptr. scoped_ptr sẽ là chính xác nhưng sau đó bất kỳ tham chiếu nào khác đến đối tượng đó sẽ phải là một con trỏ thô, có thể bị treo lơ lửng. 2. Khai báo những gì bạn thực sự muốn trở thành một tham chiếu thụ động thụ động như shared_ptr. weak_ptr sẽ là chính xác nhưng sau đó bạn có những rắc rối của việc chuyển đổi nó để share_ptr mỗi khi bạn muốn sử dụng nó.
Tôi nghi ngờ rằng dự án của bạn là một ví dụ tốt về loại rắc rối mà thực tiễn này có thể đưa bạn vào.
Nếu bạn có ứng dụng chuyên sâu về bộ nhớ, bạn thực sự cần quyền sở hữu duy nhất để thiết kế của bạn có thể kiểm soát rõ ràng tuổi thọ đối tượng.
Với quyền sở hữu duy nhất opObject = NULL; chắc chắn sẽ xóa đối tượng và nó sẽ làm điều đó ngay bây giờ.
Với quyền sở hữu chia sẻ spObject = NULL; ........ ai biết? ......
Nguồn
2009-08-07 08:15:53
Rất cám ơn! Có khoảng 200 nghìn dòng. Vì vậy, rất khó để kiểm tra mỗi mới ... là có bất kỳ Macro biên dịch để kích hoạt khả năng kiểm tra ref của tăng (nếu khả năng như vậy là tồn tại). Bộ nhớ gây ra bởi lỗi lập trình logic về các hồ bơi, tôi chắc chắn, nhưng tôi không thể tìm thấy nó. – user25749
Bạn vẫn có thể bị rò rỉ bộ nhớ với shared_ptrs. Tạo một tham chiếu tuần hoàn và nó sẽ không bao giờ bị xóa, ngay cả khi phần còn lại của ứng dụng không còn tham chiếu đến nó nữa. Rò rỉ bộ nhớ tức thì! – jalf
Một tham chiếu đến một đối tượng được giữ lại không chính xác vẫn là một rò rỉ tài nguyên. Đây là lý do tại sao các chương trình GC vẫn có thể bị rò rỉ, thường là do mẫu Observer - người quan sát nằm trong danh sách thay vì có thể quan sát và không bao giờ bị lấy đi. Cuối cùng, 'remove' là cần thiết cho mỗi' add', giống như 'delete' là cần thiết cho mỗi' new'. Chính xác cùng một lỗi lập trình, gây ra chính xác cùng một vấn đề. Một "tài nguyên" thực sự chỉ là một cặp hàm phải được gọi là số lần bằng với các đối số tương ứng và "rò rỉ tài nguyên" là những gì xảy ra khi bạn không thực hiện điều đó. –