Tôi không thực sự cần phải chia sẻ các đối tượng, nhưng tôi muốn đảm bảo không có rò rỉ bộ nhớ xảy ra. Có đúng không khi sử dụng shared_ptr trong trường hợp này?Tôi không thể sử dụng std :: vector của auto_ptr - tôi nên sử dụng shared_ptr?
Trả lời
Nếu bạn đang sử dụng tăng, boost::ptr_vector có thể phù hợp hơn với nhu cầu của bạn.
Nếu không, bạn có thể sử dụng shared_ptr
khi bạn đề xuất hoặc xóa thủ công các phần tử của véc-tơ khi bạn đã hoàn tất.
Từ quan điểm bảo trì, shared_ptr
sẽ là giải pháp ưu tiên. Tuy nhiên, lưu ý rằng shared_ptr
có thể mang lại một số hình phạt về hiệu suất, điều này có thể có hoặc không đáng kể đối với đơn đăng ký của bạn.
Đó là một chút quá mức cần thiết, nhưng không có con trỏ thông minh nào tốt hơn cho điều đó. Bạn cũng có thể xem xét các container con trỏ của boost.
Trong C++ 0x bạn có thể lưu trữ std::unique_ptr
trong các vùng chứa, gần với nhu cầu của bạn hơn.
Tôi đang sử dụng boost :: shared_ptr – amitlicht
+1 cho vùng chứa unique_ptr! – AshleysBrain
Bạn cũng có thể sử dụng Boost.PointerContainer. Sử dụng shared_ptr
thể hiện quyền sở hữu được chia sẻ. Bây giờ nếu bạn chắc chắn, rằng các đối tượng của bạn bị ràng buộc vào tuổi thọ của vùng chứa, thì PointerContainer là tùy chọn thiết kế khôn ngoan hơn (đó là ngay cả một từ?).
Nếu mức sử dụng hiệu suất/bộ nhớ ở mức thấp không phải là yêu cầu quan trọng (ví dụ 97% của tất cả các trường hợp) thì chỉ cần dùng chung với shared_ptr. Nó đơn giản và dễ hiểu.
Nếu bạn thực sự muốn giữ mọi thứ chặt chẽ và/hoặc thể hiện ý định sở hữu chính xác hơn thì boost::ptr_vector có thể tốt hơn - nhưng nếu lớp học của bạn không quản lý bất kỳ bộ nhớ nào khác thì chỉ cần xóa thủ công tội lỗi như chúng tôi đôi khi đã dẫn đến tin ;-) Tôi là một người đề xuất RAII lớn, nhưng vẫn làm điều này theo thời gian.
- 1. Tôi có nên kiểm tra tăng :: shared_ptr hoặc std :: shared_ptr trước khi tôi sử dụng không?
- 2. Cách sử dụng std :: shared_ptr
- 3. Bạn có sử dụng std :: shared_ptr <std::vector> thay vì tăng :: shared_array không?
- 4. Tôi có nên sử dụng boost :: ptr_vector <T> hoặc vector <boost :: shared_ptr <T>>?
- 5. Khi sử dụng shared_ptr nên tôi chỉ sử dụng khai báo shared_ptr một lần hoặc khai báo shared_ptr ở mọi nơi tôi vượt qua nó?
- 6. Sử dụng Boost Python & std :: shared_ptr
- 7. Tại sao tôi nên sử dụng std :: async?
- 8. Tôi có nên sử dụng HttpRuntime.Cache không?
- 9. Tôi có nên sử dụng ProGuard không?
- 10. Làm thế nào để giải quyết xung đột giữa tăng :: shared_ptr và sử dụng std :: shared_ptr?
- 11. Tôi có nên sử dụng jQuery.each() không?
- 12. Sử dụng deleter tùy chỉnh với std :: shared_ptr
- 13. tôi nên sử dụng RoutedEventHandler
- 14. Tôi có nên sử dụng nguyên mẫu hay không?
- 15. Tôi nên sử dụng container STL nào cho FIFO?
- 16. Khi nào tôi nên (và tôi không nên) sử dụng chú thích @inline của Scala?
- 17. Sử dụng luabind và std :: shared_ptr với thừa kế
- 18. Khi nào tôi nên sử dụng Bảng chỉ mục của Oracle? Hoặc, khi tôi không nên?
- 19. Tôi nên std :: di chuyển một shared_ptr trong một nhà xây dựng di chuyển?
- 20. Tôi muốn sử dụng NumPy/SciPy. Tôi có nên sử dụng Python 2 hoặc 3 không?
- 21. Tôi có nên sử dụng ScriptSharp
- 22. Tại sao tôi nên sử dụng glBindAttribLocation?
- 23. Tôi nên sử dụng IronPython IDE nào?
- 24. Tôi nên sử dụng IEnumerable hoặc IList?
- 25. Tôi nên sử dụng PreApplicationStartMethod nào?
- 26. Tại sao không nên sử dụng attach() trong R, và tôi nên sử dụng cái gì?
- 27. Tôi nên sử dụng gói postgresql nào?
- 28. Khi nào tôi nên sử dụng adorners?
- 29. Sử dụng boost shared_ptr
- 30. Tôi nên sử dụng JSObject nào?
Các đối tượng được lưu trữ trong véc tơ được phân bổ động không? Họ có phải vậy không? –