首页 > 解决方案 > 如何为std函数分配空间并做memcpy?

问题描述

我有以下一段代码。

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?

标签: c++

解决方案


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


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


推荐阅读