Ich brauche oft so etwas wie dies mehr als tun:Wie die Verwendung von std :: bind mit std kombinieren :: shared_ptr
AsyncOperation * pAsyncOperation = new AsyncOperation();
auto bindOperation = std::bind(&AsyncOperation::operator(), std::ref(*pAsyncOperation));
std::thread thread(bindOperation);
thread.join();
mit AsyncOperation
jede benutzerdefinierte Klasse sein operator()
(auch bekannt als Funktors Umsetzung oder Funktionsobjekt).
Ist es möglich, der std::bind
eine std::shared_ptr
anstelle einer std::ref
zu verwenden? Dies würde Speicherverluste verhindern, ohne dass ich eine Referenz auf pAsyncOperation
behalten müsste, und würde die AsyncOperation
automatisch am Ende des Threads löschen, das ist das Ende dieser asynchronen Aufgabe.
EDIT: Ich habe nicht immer Zugriff auf std :: thread, die Thread-Bibliothek kann boost :: thread oder sogar andere plattformabhängige Threads sein. Und folglich keinen Zugriff auf std :: async.
Mein Hauptproblem ist eine Vorstellung von Besitz in der std :: bind.
Haben Sie versucht, 'std :: shared_ptr' zu benutzen? Sieht so aus, als kompiliere es ohne Probleme: http://liveworkspace.org/code/1e83d9698703711b7ed2ce0d44cf86f2 – PiotrNycz
Was Sie wissen müssen, ist, dass 'std :: bind 'gebundene Argumente nach Wert speichert (dh wie übergeben), wenn Sie also ein owning übergeben Zeiger nach Wert als einer der Parameter, dieser Zeiger wird in den resultierenden Funktor "kopiert" und hält somit Besitz, selbst nachdem der ursprüngliche 'shared_ptr' den Gültigkeitsbereich verlassen hat. – haelix