Ошибка при выполнении программы в функции, которая возвращает другую функцию

Я пытаюсь вызвать функцию «testfun» внутри функции «test», используя «std:: function», уменьшая количество переменных на 1 и выполняя промежуточные вычисления.

Класс «А» (вектор) содержит одномерный массив двойных значений.

Во время выполнения программа останавливается в указанной точке и 'функциональный' файл открывается на '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.

François Andrieux 22.05.2019 16:08

«программа завершается в указанной точке»: указано как?

Scott Hunter 22.05.2019 16:09

Я добавил комментарий с точкой, где программа не работает

Perotto 22.05.2019 16:10

изменение 'void' на 'int' не кажется решением =)

Perotto 22.05.2019 16:10

Это неопределенное поведение anon принимает f по ссылке, но f является локальным, у вас есть оборванная ссылка в result.

rafix07 22.05.2019 16:12
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
5
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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;
}

возвращенная лямбда получает f по биту ссылки anon() получает f по копии.

Поэтому, когда вы вызываете возвращаемую лямбду за пределамиanon(), она содержит висячую ссылку на f.

Предложение: попробуйте передать f лямбде путем копирования.

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

Да, похоже, это проблема. Как его правильно закодировать? Я попытался создать копию «f», например std::function<double(A*, A*)> f1 = f;, но это приводит к той же ошибке.

Perotto 22.05.2019 16:18

@Perotto - как было предложено в конце ответа, попробуйте передать f лямбде путем копирования: std::function<double(A*)> result = [&, f](A * param_)

max66 22.05.2019 16:20

Другие вопросы по теме