Trước hết, tôi nhận ra điều này hoàn toàn mâu thuẫn với mục đích của shared_ptr. Tôi đang đối phó với một số mã thư viện nơi các thể hiện của một ParticleSystem mong muốn có một shared_ptr được truyền cho chúng trong khi xây dựng để thiết lập kết cấu được sử dụng cho mỗi hạt. Vấn đề là, tôi đã xây dựng phần còn lại của chương trình theo cách mà kết cấu của tôi có quyền sở hữu cụ thể (nếu đó là thuật ngữ đúng) - TextureCache sở hữu tất cả Textures. Vì vậy, tôi cần một cách để làm việc với lớp ParticleSystem này mà không cho phép nó xóa kết cấu của tôi. Nếu tôi chỉ đơn giản là tạo một thể hiện mới như ParticleSystem(std::shared_ptr<Texture>&myTexture)
thì nó sẽ cố gắng phá hủy kết cấu khi nó bị phá hủy (đó là một hoạt động không mong muốn và không hợp lệ, vì kết cấu của tôi thậm chí không được tạo ra với new
).Chuyển một đối tượng đến một hàm mong muốn shared_ptr mà không thực sự chia sẻ quyền sở hữu
Cách sạch nhất mà tôi nhìn thấy xung quanh vấn đề này là một cái gì đó như thế này:
- Tạo một shared_ptr giữ kết cấu trong chức năng mà tạo ra ParticleSystem.
- Sau đó sử dụng vị trí mới, xây dựng lại shared_ptr trong cùng một vị trí bộ nhớ như shared_ptr mà tôi vừa tạo. Kết cấu bây giờ sẽ có số tham chiếu là 2.
- Tạo hệ thống hạt.
- Hãy để shared_ptr nằm ngoài phạm vi. Deconstructor của nó sẽ được gọi kể từ khi nó được cấp phát trên stack, và nó sẽ giảm số lượng tham chiếu chỉ bằng 1. Do đó, số tham chiếu cho đối tượng sẽ luôn lớn hơn 1 lần so với thực tế, và vì vậy nó sẽ không bao giờ bị hủy tự động.
Tôi tin rằng giải pháp này là âm thanh, nhưng nó vẫn cảm thấy vô cùng đáng sợ. Có cách nào tốt hơn để giải quyết vấn đề của tôi không?
Tại sao không có trong bộ nhớ cache shared_ptrs kết cấu của bạn? –
@Vaughn là khả thi, nhưng nó có vẻ như một mức độ không cần thiết của indirection bằng cách theo dõi con trỏ đến kết cấu hơn là kết cấu và nó sẽ là lạm dụng các con trỏ chia sẻ ngữ nghĩa vì bộ nhớ cache kết cấu vẫn chịu trách nhiệm quyết định khi nào để giải phóng kết cấu - nó sẽ không được * chia sẻ * quyền sở hữu. – Ponkadoodle