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

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 通过引用接收fanon() 通过复制接收f

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

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

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

【讨论】:

是的,这似乎是个问题。如何正确编码?我试图创建一个像 std::function&lt;double(A*, A*)&gt; f1 = f; 这样的 'f' 的副本,但这会导致同样的错误 @Perotto - 按照答案末尾的建议,尝试通过复制将f 传递给 lambda:std::function&lt;double(A*)&gt; result = [&amp;, f](A * param_)

以上是关于在返回另一个函数的函数中执行程序时出错的主要内容,如果未能解决你的问题,请参考以下文章

出错处理2——包裹函数

尝试通过数据框在 Pyspark 中执行用户定义的函数时出错

出错时停止代码执行 (C++)

从 UDF 返回 StructType 的 ArrayType 时出错(并在多个 UDF 中使用单个函数)

fork和vfork函数

在 getStaticProps 函数中序列化 Next.js 时出错?