我尝试使用'std :: function'在'test'函数内调用'testfun'函数,将变量数减少1并执行中间计算。
'A'类(向量)包含一维double数组。
在执行过程中,程序在指定点终止,并在“ const auto _Impl = _Getimpl();”上打开“ functional”文件。线。如何解决问题?
#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);
}
答案 0 :(得分:2)
不确定这是唯一的问题,而是一个问题。
在以下功能中
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 */ }