在返回另一个函数的函数中执行程序时出错
Posted
技术标签:
【中文标题】在返回另一个函数的函数中执行程序时出错【英文标题】:Error during program execution in function that returns another function 【发布时间】:2019-05-22 14:07:04 【问题描述】:我尝试使用“std::function”在“test”函数中调用“testfun”函数,将变量数减1并执行中间计算。
“A”类(向量)包含一个一维双精度数组。
在执行期间,程序在指定点终止,并在“const auto _Impl = _Getimpl();”上打开“功能”文件线。如何解决问题?
#include <functional>
class A
public:
double* d;
unsigned s;
A(unsigned size)
s = size;
d = new double[s];
;
double testfun(A* param, A* x)
return param->d[0] + param->d[1] * x->d[0];
std::function<double(A*)> anon(std::function<double(A*, A*)> f, A& x, A& y)
std::function<double(A*)> result = [&](A * param_)
// Program fails somewhere at that point
double sum = 0.0;
for (unsigned i = 0; i < x.s; i++)
sum += f(param_, &x) - y.d[i];
return sum;
;
return result;
double test(std::function<double(A*, A*)> f)
A x(1); A y(1);
x.d[0] = 0.0;
y.d[0] = 2.0;
A* param = new A(2);
param->d[0] = 2.0; param->d[1] = 6.0;
std::function<double(A*)> func = anon(f, x, y);
return func(param);
void main()
double t = test(testfun);
【问题讨论】:
main
的返回类型必须是int
。
“程序在指定点终止”:指定如何?
我在注释中添加了程序失败的地方
将 'void' 更改为 'int' 似乎不是解决方案 =)
这是未定义的行为 anon
通过引用获取 f
,但 f
是本地的,您在 result
中有悬空引用。
【参考方案1】:
不确定这是唯一的问题,但确实是个问题。
在下面的函数中
std::function<double(A*)> anon(std::function<double(A*, A*)> f, A& x, A& y)
std::function<double(A*)> result = [&](A * param_)
// Program fails somewhere at that point
double sum = 0.0;
for (unsigned i = 0; i < x.s; i++)
sum += f(param_, &x) - y.d[i];
return sum;
;
return result;
返回的 lambda 通过引用接收f
位anon()
通过复制接收f
。
因此,当您调用返回的 lambda 外部 anon()
时,它包含对f
的悬空引用。
建议:尝试通过复制将f
传递给 lambda。
// ....................................V f by copy
std::function<double(A*)> result = [&, f](A * param_)
/* lambda content */
【讨论】:
是的,这似乎是个问题。如何正确编码?我试图创建一个像std::function<double(A*, A*)> f1 = f;
这样的 'f' 的副本,但这会导致同样的错误
@Perotto - 按照答案末尾的建议,尝试通过复制将f
传递给 lambda:std::function<double(A*)> result = [&, f](A * param_)
以上是关于在返回另一个函数的函数中执行程序时出错的主要内容,如果未能解决你的问题,请参考以下文章
尝试通过数据框在 Pyspark 中执行用户定义的函数时出错