如何为std函数分配空间并执行memcpy?

时间:2019-02-02 18:00:23

标签: c++

我有以下一段代码。

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?

1 个答案:

答案 0 :(得分:3)

首先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
}


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