c++ - 在返回另一个函数的函数中执行程序时出错

标签 c++ lambda

我尝试使用“std::function”在“test”函数中调用“testfun”函数,将变量数减 1 并执行中间计算。

“A”类( vector )包含一维 double 组。

在执行过程中,程序在指定点终止,并在“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 通过引用位接收 f anon() 通过拷贝接收 f

因此,当您在 外部 anon() 调用返回的 lambda 时,它包含对 f 的悬空引用。

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

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

关于c++ - 在返回另一个函数的函数中执行程序时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56258759/

相关文章:

c++ - 用于修改 bool 类型 vector (特殊容器)的 lambda 表达式中 auto 推导的类型是什么

c++ - 使用 for_each C++ 将数据输出到文件?

c++ - VirtualAlloc C++,注入(inject)的dll,asm

c++ - 编译器什么时候为类的特殊成员提供定义?

Java 8 按类分离列表元素

Java流,从2个列表中获取数据

java - 如何阻止功能接口(interface)成为 lambda 表达式的目标?

c++如何根据我要处理的文件更改void *的大小

c++ - MSVC 错误 - 错误 C2373 : 'description' : redefinition; different type modifiers

Java Lambda 捕获还是重新执行?