tôi cần phải làm một cái gì đó như thế này hơn thường:Làm thế nào để kết hợp việc sử dụng std :: ràng buộc với std :: shared_ptr
AsyncOperation * pAsyncOperation = new AsyncOperation();
auto bindOperation = std::bind(&AsyncOperation::operator(), std::ref(*pAsyncOperation));
std::thread thread(bindOperation);
thread.join();
với AsyncOperation
là bất kỳ lớp tùy chỉnh thực hiện operator()
(còn gọi là functor hoặc đối tượng hàm).
Có thể chỉ định cho std::bind
để sử dụng số std::shared_ptr
thay vì std::ref
? Điều này sẽ ngăn chặn rò rỉ bộ nhớ, mà không cần phải giữ tham chiếu trên pAsyncOperation
và tự động xóa AsyncOperation
ở cuối chuỗi, đó là kết thúc của tác vụ không đồng bộ này.
EDIT: Tôi không phải lúc nào cũng có quyền truy cập vào std :: thread, thư viện chủ đề có thể được tăng :: thread hoặc thậm chí bất kỳ chủ đề phụ thuộc nền tảng nào khác. Và do hậu quả, không truy cập vào std :: async.
Vấn đề chính của tôi là có khái niệm sở hữu trong tiêu chuẩn std :: bind.
Bạn đã cố gắng sử dụng 'std :: shared_ptr'? Có vẻ như biên dịch không có vấn đề: http://liveworkspace.org/code/1e83d9698703711b7ed2ce0d44cf86f2 – PiotrNycz
Những gì bạn cần biết là 'std :: bind' lưu trữ các đối số liên kết theo giá trị (tức là, khi được thông qua), do đó, nếu bạn chuyển quyền sở hữu con trỏ bởi giá trị là một trong các tham số, con trỏ đó được 'sao chép' vào functor kết quả, do đó, giữ quyền sở hữu ngay cả sau khi 'shared_ptr' ban đầu đi ra khỏi phạm vi. – haelix