c++ - 如何为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?
解决方案
首先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
}
要回答您在有关递归的评论中给出的动机:这可能是错误的方法。如果您认为递归的深度可能会溢出堆栈,那么您应该尝试使用循环来重写您的算法。试图通过将局部变量移动到堆中来节省堆栈空间可能只是一个临时解决方案,如果它能给你任何结果的话。
推荐阅读
- python - 运行 Flask 脚本时如何修复 OSError
- python - django makemigrations 覆盖以创建具有自定义名称的迁移文件
- javascript - 无法运行在 head 标记中动态添加的 javascript 文件
- python - 如何根据熊猫数据框中的其他列值更新“平衡”列
- laravel - 如何在 Laravel 7 的 Http 请求中设置代理?
- excel - 隐藏多个工作表并仅显示一个工作表 vba
- node.js - 安装依赖项以处理现有的 Angular 项目
- java - 如何在内部或从正在运行的应用程序中的依赖项执行 jar?
- python - 如何使用 ctypes 将 SendInput 函数包装到 python
- c++ - 结构中带有空格的字符串