Tôi đang sử dụng libev yêu cầu truyền dữ liệu của tôi tới khoảng trống * để tuân thủ các cấu trúc được xác định trước của chúng. Tôi cần phải cast boost :: shared_ptr vào một void * và sau đó cast void * trở lại một boost :: shared_ptr. Đây là mã của tôi để làm điều đóboost shared_ptr casting thành void *
void foo(boost::shared_ptr<string>& a_string)
{
void* data = (void*)a_string.get();
boost::shared_ptr<string> myString((string*)data);
}
Tôi khá chắc chắn việc này tốt, tuy nhiên cách mã của tôi là thiết lập Tôi tin rằng tất cả các tài liệu tham khảo shared_ptr chuỗi của tôi đang đi ra khỏi phạm vi là phương pháp đúc này không làm tăng use_count và do đó shared_ptr là giải phóng bộ nhớ trong khi tôi vẫn cần nó.
Có cách nào để tăng/giảm số lần sử dụng bằng tay không? Lý tưởng nhất là tôi sẽ tăng giá trị use_count khi tôi truyền vào khoảng trống *, vượt qua khoảng trống * của tôi với một hàm khác, bỏ khoảng trống * trở lại shared_ptr và giảm giá trị use_count.
Hoặc nếu có ai biết giải pháp khác cho vấn đề này, tôi có thể sử dụng bất kỳ trợ giúp nào.
Bạn có thể lưu người quan sát trong một lớp chứa cả người quan sát và 'shared_ptr'. Điều này sẽ đảm bảo rằng thời gian tồn tại của người theo dõi sẽ được so khớp hoặc vượt quá tuổi thọ của đối tượng thuộc sở hữu của 'shared_ptr'. Ngoài ra, tại sao không lưu địa chỉ của 'shared_ptr' chính nó thay vì lưu trữ địa chỉ của đối tượng được trỏ tới? – Mankarse
Tôi tìm thấy một hack xung quanh bằng cách làm cho một cấu trúc có chứa shared_ptr và đúc cấu trúc để một void *. Không chắc tôi cảm thấy thế nào về giải pháp này.Ngoài ra, tôi thấy trong một diễn đàn ở đâu đó mà bạn không nên sử dụng địa chỉ của shared_ptr. –
@ user1229962: Bạn đang truyền cái gì 'void *' đến? –