我有以下代码。

void functionName(std::function<void()> &&lambda){
  void* h = (void *)malloc(sizeof(lambda));
  memcpy(h,lambda, sizeof(lambda));
  performTask(&h);
}


performTask将获取地址并运行lambda函数。
但是我无法执行memcpy,因为memcpy中的第二个参数必须是const void *。

所以我将memcpy修改为memcpy(h,(void *)&lambda,sizeof(lambda));
尽管编译成功,但在运行期间会引发段错误。

如何在此代码方案中正确执行memcpy?

最佳答案

首先,std::function不是lambda,它是用于包装包括lambdas在内的所有可调用对象的类模板。

其次,您永远不要尝试使用malloc,尤其是memcpy非POD C ++类型。他们有自己的一组构造函数/赋值运算符,它们提供了正确复制它们的方法。例如:

void functionName(std::function<void()> &&lambda) {
  auto h = new std::function<void()>(std::move(lambda));
  performTask(h);
  delete h; //assuming that performTask isn't asynchronous
}



为了回答您在递归注释中给出的动机:这可能是错误的处理方式。如果您认为递归的深度可能会使堆栈溢出,那么您应该尝试使用循环来重写算法。如果试图通过将局部变量移到堆中来节省堆栈空间,那么这可能只是一个临时解决方案,如果它可以给您带来任何结果。

关于c++ - 如何为std函数分配空间并执行memcpy?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54495877/

10-13 08:27