我需要经常做这样的事情:
AsyncOperation * pAsyncOperation = new AsyncOperation();
auto bindOperation = std::bind(&AsyncOperation::operator(), std::ref(*pAsyncOperation));
std::thread thread(bindOperation );
thread.join();
AsyncOperation
是实现operator()
(也称为函数对象)的任何自定义类。
是否可以指示 std::bind
使用 std::shared_ptr
而不是 std::ref
?
这将防止内存泄漏,而无需我保留对 pAsyncOperation
的引用,并且会在线程末尾自动删除 AsyncOperation
,即此异步的末尾任务。
编辑:我并不总是可以访问 std::thread,线程库可以是 boost::thread 甚至任何其他平台相关的线程。因此,无法访问 std::async。
我的主要问题是在 std::bind 中有一个所有权的概念。
最佳答案
这个有效:
struct AsyncOperation {
void operator()()
{
std::cout << "AsyncOperation" << '\n';
}
};
int main() {
std::shared_ptr<AsyncOperation> pAsyncOperation = std::make_shared<AsyncOperation>();
auto bindOperation = std::bind(&AsyncOperation::operator(), pAsyncOperation);
std::thread thread(bindOperation );
thread.join();
}
参见:http://liveworkspace.org/code/4bc81bb6c31ba7b2bdeb79ea0e02bb89
关于c++ - 如何结合使用 std::bind 和 std::shared_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13272831/