我有以下代码。
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/