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

时间:2019-05-22 14:07:04

标签: c++ lambda

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

1 个答案:

答案 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 */ }