Wie kombinieren Sie die Verwendung von std::bind mit std::shared_ptr

Ich brauche, so etwas zu tun, mehr als oft:

AsyncOperation * pAsyncOperation = new AsyncOperation();
auto bindOperation = std::bind(&AsyncOperation::operator(), std::ref(*pAsyncOperation));
std::thread thread(bindOperation );
thread.join();

mit AsyncOperation jede benutzerdefinierte Klasse die operator() (auch bekannt als Funktor oder eine Funktion Objekt).

Ist es möglich anzugeben, um die std::bind zu verwenden std::shared_ptr statt einer std::ref ?
Dies würde verhindern, dass Speicher-Lecks, ohne meinen zu müssen, halten eine Referenz auf pAsyncOperation, und löschen würde die AsyncOperation automatisch an das Ende des Fadens, das ist das Ende dieses asynchrone Aufgabe.

EDIT: habe ich nicht immer Zugriff auf std::thread, der thread-Bibliothek boost::thread oder sogar eine andere Plattform angewiesen threads. Und durch die Konsequenz, nicht den Zugang zu std::async.

Mein Hauptproblem ist es, eine Vorstellung von Besitz in der std::bind.

  • Haben Sie versucht, zu verwenden std::shared_ptr? Sieht kompiliert ohne Probleme: liveworkspace.org/code/1e83d9698703711b7ed2ce0d44cf86f2
  • Was Sie wissen müssen ist, dass std::bind stores gebunden Argumente per Wert (d.h., "bestanden"), daher, wenn Sie eine besitzen Zeiger durch Wert als einer der parameter, die Zeiger erhält "kopiert" werden in die resultierende Funktor, also holding Besitz, auch nachdem die ursprüngliche shared_ptr geht out of scope.
Schreibe einen Kommentar