VC ++ сообщает о сбое во время выполнения при реализации обратного вызова с использованием unique_ptr - PullRequest
0 голосов
/ 25 ноября 2018

Мне нужно реализовать метод обратного вызова, используя unique_ptr другого класса:

#include <iostream>
#include <functional>
#include <memory>
#include <vector>

class A
{
public:
void Show(std::vector<int> a, int b) {std::cout << "Hello " << " " << b << std::endl;}
};

class B
{
public:
void SetCB(std::function<void(std::vector<int> ,int)> callb);
std::function<void(std::vector<int> ,int)> cb;
};

void B::SetCB(std::function<void(std::vector<int> ,int)> callb)
{
cb= callb;
}

int main()
{
std::unique_ptr<A> a1 = std::make_unique<A>();
std::unique_ptr<B> b1 = std::make_unique<B>();
b1->SetCB([&](std::vector<int> a, int b){a1->Show(a,b);});
std::vector<int> y;
b1->cb(y,4);
}

Я получаю нарушение доступа к чтению во время выполнения в VC ++ - как мы можем реализовать обратный вызов с использованием unique_ptr с некоторымипараметры с использованием std :: bind или другими способами?

$ c++ -std=c++14 try68.cpp

                 ^

Разве невозможно установить методы обратного вызова с использованием unique_ptr?

1 Ответ

0 голосов
/ 26 ноября 2018

Совет, вы должны быть очень осторожны, используя лямбда-колбэк, который захватывает локальные переменные по ссылке .Если ваш обратный вызов возвращается из области действия переменной a1 (которая является функцией main (), поэтому с вашим примером все в порядке), тогда выражение a1->Show(a,b) вызовет неопределенное поведение, так как a1 является висящимссылка .Если ваша функция обратного вызова остается в области действия захваченных переменных, тогда ваш код в порядке, но если вам нужно передать обратный вызов, вы должны захватить a1, сдвинув:

b1->SetCB([ptr=std::move(a1)](std::vector<int> a, int b){ptr->Show(a,b);};

Тогда вашфункция обратного вызова получит право собственности на объект, на который a1 указал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...