在返回另一个函数的函数中执行程序期间出错

Error during program execution in function that returns another function

本文关键字:函数 出错 执行程序 返回 另一个      更新时间:2023-10-16

我尝试使用"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);
}

不确定这是唯一的问题,但这是一个问题。

在以下函数中

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 通过引用位接收fanon()通过副本接收f

所以当你在anon()之外调用返回的 lambda 时,它包含一个对f的悬空引用。

建议:尝试通过复制将f传递给lambda。

// ....................................V  f by copy
std::function<double(A*)> result = [&, f](A * param_)
{ /* lambda content */ }