захватить std :: function по значению - PullRequest
2 голосов
/ 01 апреля 2012

Я использую следующий код:

struct WorkData
{
    std::string name;
    std::function<void(std::string)> Callback;

    WorkData(){};
    WorkData(const WorkData& other)
    {
        name = other.name;
        Callback = std::ref(other.Callback);
    }
};

WorkData data; // this is the data to pass to queue_task() function bellow
data.Callback = std::bind(&ResultProcessor::Handler, resProc, std::placeholders::_1);

template <typename Functor>
void queue_task(Functor& fn, WorkData& workData )
{
    group.run([&fn, workData](){
          workData.Callback("resultComming"); // runtime ERROR- access violation
    });
}

Функции очереди queue_task работают асинхронно в другом потоке (вызывая group.run (lambda) сверху).Проблема, с которой я сталкиваюсь, заключается в том, что при попытке вызвать workData.Callback (). Я получаю нарушение прав доступа.workData по значению, чтобы при выполнении лямбды group.run () у него была копия состояния при вызове queue_task ().Я ожидаю, что workData.Callback () будет выполняться на экземпляре объекта, переданного в строке:

data.Callback = std::bind(&ResultProcessor::Handler, resProc, std::placeholders::_1);

РЕДАКТИРОВАТЬ: resProc сверху жива (не уничтожена), когда строка аварии называется

1 Ответ

1 голос
/ 01 апреля 2012

Использование std::ref в конструкторе копирования означает, что вы сохраняете ссылку на старый WorkData элемент Callback, а не копию. Вы хотите, чтобы Callback = other.Callback сделал копию, чтобы избежать нарушения прав доступа (возможно, от доступа к старому обратному вызову после того, как он был освобожден). Чтобы сохранить ссылку на resProc в std::function, вам необходимо использовать std::ref(resProc) при вызове std::bind.

...