Có thể lấy con trỏ thô từ tăng :: weak_ptr không? Shared_ptr của Boost có phương thức get() và toán tử "->". Có một số lý do đằng sau weak_ptr không có chức năng tương tự?Tôi có thể lấy con trỏ thô từ weak_ptr của boost không?
Trả lời
A weak_ptr
giữ tham chiếu không sở hữu, do đó đối tượng mà nó tham chiếu có thể không tồn tại nữa. Sẽ rất nguy hiểm khi sử dụng con trỏ thô được giữ bởi weak_ptr
.
Cách tiếp cận đúng là quảng bá số weak_ptr
đến shared_ptr
bằng cách sử dụng weak_ptr::lock()
và lấy con trỏ từ đó.
Boost weak_ptr
documentation giải thích lý do tại sao sẽ không an toàn để cung cấp chức năng get()
như một phần của weak_ptr
và có các ví dụ về mã có thể gây ra sự cố.
Trước tiên, bạn cần lấy được shared_ptr từ weak_ptr trước khi giữ con trỏ thô.
Bạn có thể gọi lock để có được những shared_ptr, hoặc các nhà xây dựng shared_ptr:
boost::weak_ptr<int> example;
...
int* raw = boost::shared_ptr<int>(example).get();
Như đã viết, điều này không an toàn - bạn có thể bị bỏ lại bằng một con trỏ lơ lửng nếu đối tượng bị xóa khi 'shared_ptr' tạm thời bị hủy. Bạn nên giữ 'shared_ptr' cho miễn là bạn đang sử dụng con trỏ thô. –
Đây là một câu hỏi cũ và câu trả lời được chấp nhận là tốt, vì vậy tôi ngần ngại gửi câu trả lời khác, nhưng có một điều mà dường như thiếu là một tốt thành ngữ sử dụng ví dụ:
boost::weak_ptr<T> weak_example;
...
if (boost::shared_ptr<T> example = weak_example.lock())
{
// do something with example; it's safe to use example.get() to get the
// raw pointer, *only if* it's only used within this scope, not cached.
}
else
{
// do something sensible (often nothing) if the object's already destroyed
}
một lợi thế quan trọng của thành ngữ này là con trỏ mạnh có phạm vi đến if-đúng khối, giúp ngăn chặn vô tình sử dụng một tham chiếu không khởi tạo, hoặc giữ một tham chiếu mạnh mẽ quanh lâu er hơn là thực sự cần thiết.
- 1. Sự khác nhau giữa con trỏ thô và weak_ptr là gì?
- 2. Tạo shared_ptr từ con trỏ thô
- 3. Tôi có thể viết một hàm C++ chấp nhận cả một con trỏ thô và một con trỏ thông minh?
- 4. OpenCV hoặc Boost con trỏ thông minh
- 5. Khi nào tôi nên sử dụng con trỏ thô trên con trỏ thông minh?
- 6. Tôi có thể đặt kết nối sqlite và con trỏ của tôi vào một hàm không?
- 7. C + + con trỏ thô và tiêu chuẩn :: shared_ptr
- 8. Tôi có thể nhận nút NUMA từ địa chỉ con trỏ (trong C trên Linux) không?
- 9. Container của shared_ptr nhưng lặp lại với các con trỏ thô
- 10. Lợi ích của việc sử dụng reference_wrapper thay vì con trỏ thô trong các vùng chứa?
- 11. boost :: python and weak_ptr: công cụ biến mất
- 12. Cách lấy tên hàm từ con trỏ hàm trong C#?
- 13. Có vectơ weak_ptr, muốn trả về véc tơ của shared_ptr
- 14. Tôi có thể đặt lại vị trí của con trỏ về đầu không?
- 15. Con trỏ tĩnh có phải là con trỏ mạnh không?
- 16. Cách lấy giá trị cột từ con trỏ sqlite?
- 17. Dereference của con trỏ null, nhưng tôi không sử dụng con trỏ
- 18. Cách lấy con trỏ này từ std :: function?
- 19. Chỉ lấy đối tượng đầu tiên từ Con trỏ Mongo
- 20. Có thể lấy nhật ký xây dựng thô từ xây dựng TeamCity không?
- 21. Làm thế nào tôi có thể lấy số cột của con trỏ trong một TextBox trong C#?
- 22. lấy hồ sơ từ con trỏ trong SQL
- 23. Cách lấy tên hàm của con trỏ chức năng C
- 24. Làm thế nào tôi có thể nhận tọa độ con trỏ (con trỏ) hiện tại trong X
- 25. Hiển thị một phần bên trong js.erb. Có thể lấy chuỗi thô để tôi có thể xóa khoảng trống không?
- 26. Bạn có thể lấy con trỏ tới byte dưới theo cách độc lập không?
- 27. demote boost :: function cho một con trỏ hàm đồng bằng
- 28. Cách lấy dữ liệu từ lớp con trỏ
- 29. Lấy văn bản thô từ JTextPane
- 30. Con trỏ có xấu không?
Đối với vấn đề đó, bạn có thể được để lại bằng một con trỏ lơ lửng nếu bạn nhận được một con trỏ thô cho 'shared_ptr' bị hủy sau đó ... trong trường hợp Đa luồng, bạn thậm chí có thể được để lại với một con trỏ lơ lửng trong khi chạy mã 'if (! weak.expired()) weak-> run();' như đối tượng được trỏ tới có thể bị hủy giữa phép thử và thực thi phương thức (tôi cho rằng chính phương thức đó được đồng bộ hóa chính xác) ... –
@Matthieu: tất nhiên bạn * có thể *, giống như bạn có thể được để lại với một con trỏ lơ lửng nếu bạn rõ ràng 'xóa' một đối tượng nhưng giữ một con trỏ đến nó. Điểm cần phải thúc đẩy 'weak_ptr' thành' shared_ptr' là nó khuyến khích bạn sử dụng con trỏ thô một cách chính xác, theo các quy tắc mà bạn thường sử dụng cho 'shared_ptr :: get'. Sẽ không có cách nào tương đương với việc sử dụng một con trỏ thô thu được trực tiếp từ 'weak_ptr'. –